From a4dda7a9fc981b1beb4df4b55b969d4a65e4a012 Mon Sep 17 00:00:00 2001 From: Necati Meral Date: Sun, 14 Jun 2020 21:31:24 +0200 Subject: [PATCH 001/190] Splitted `ICrudAppService` interface --- .../Application/Services/ICreateAppService.cs | 19 +++++++++++++ .../Services/ICreateUpdateAppService.cs | 26 +++++++++++++++++ .../Application/Services/ICrudAppService.cs | 14 ++++------ .../Application/Services/IDeleteAppService.cs | 12 ++++++++ .../Services/IReadOnlyAppService.cs | 28 +++++++++++++++++++ .../Application/Services/IUpdateAppService.cs | 19 +++++++++++++ 6 files changed, 109 insertions(+), 9 deletions(-) create mode 100644 framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICreateAppService.cs create mode 100644 framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICreateUpdateAppService.cs create mode 100644 framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IDeleteAppService.cs create mode 100644 framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IReadOnlyAppService.cs create mode 100644 framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IUpdateAppService.cs diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICreateAppService.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICreateAppService.cs new file mode 100644 index 0000000000..bd9a4f4620 --- /dev/null +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICreateAppService.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace Volo.Abp.Application.Services +{ + public interface ICreateAppService + : ICreateAppService + { + + } + + public interface ICreateAppService + : IApplicationService + { + Task CreateAsync(TCreateInput input); + } +} diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICreateUpdateAppService.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICreateUpdateAppService.cs new file mode 100644 index 0000000000..12362e9b73 --- /dev/null +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICreateUpdateAppService.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Volo.Abp.Application.Services +{ + public interface ICreateUpdateAppService + : ICreateUpdateAppService + { + + } + + public interface ICreateUpdateAppService + : ICreateUpdateAppService + { + + } + + public interface ICreateUpdateAppService + : ICreateAppService + , IUpdateAppService + , IApplicationService + { + + } +} diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICrudAppService.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICrudAppService.cs index 12f3b51d11..b3b873cd5b 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICrudAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICrudAppService.cs @@ -1,4 +1,5 @@ using System.Threading.Tasks; + using Volo.Abp.Application.Dtos; namespace Volo.Abp.Application.Services @@ -28,16 +29,11 @@ namespace Volo.Abp.Application.Services } public interface ICrudAppService - : IApplicationService + : IReadOnlyAppService + , ICreateUpdateAppService + , IDeleteAppService + , IApplicationService { - Task GetAsync(TKey id); - - Task> GetListAsync(TGetListInput input); - - Task CreateAsync(TCreateInput input); - - Task UpdateAsync(TKey id, TUpdateInput input); - Task DeleteAsync(TKey id); } } diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IDeleteAppService.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IDeleteAppService.cs new file mode 100644 index 0000000000..0a70e2a95e --- /dev/null +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IDeleteAppService.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace Volo.Abp.Application.Services +{ + public interface IDeleteAppService : IApplicationService + { + Task DeleteAsync(TKey id); + } +} diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IReadOnlyAppService.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IReadOnlyAppService.cs new file mode 100644 index 0000000000..2f4ad1b9c7 --- /dev/null +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IReadOnlyAppService.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +using Volo.Abp.Application.Dtos; + +namespace Volo.Abp.Application.Services +{ + public interface IReadOnlyAppService + : IReadOnlyAppService + { + + } + + public interface IReadOnlyAppService + : IReadOnlyAppService + { + + } + + public interface IReadOnlyAppService + { + Task GetAsync(TKey id); + + Task> GetListAsync(TGetListInput input); + } +} diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IUpdateAppService.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IUpdateAppService.cs new file mode 100644 index 0000000000..043050b170 --- /dev/null +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IUpdateAppService.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace Volo.Abp.Application.Services +{ + public interface IUpdateAppService + : IUpdateAppService + { + + } + + public interface IUpdateAppService + : IApplicationService + { + Task UpdateAsync(TKey id, TUpdateInput input); + } +} From 10c00be2dc39e6d2c39328466ee1b77bad890e95 Mon Sep 17 00:00:00 2001 From: Necati Meral Date: Sun, 14 Jun 2020 22:20:11 +0200 Subject: [PATCH 002/190] Implemented rudimentary readonly appservices --- .../Services/AbstractKeyReadOnlyAppService.cs | 185 ++++++++++++++++++ .../Services/ReadOnlyAppService.cs | 45 +++++ 2 files changed, 230 insertions(+) create mode 100644 framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyReadOnlyAppService.cs create mode 100644 framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ReadOnlyAppService.cs diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyReadOnlyAppService.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyReadOnlyAppService.cs new file mode 100644 index 0000000000..c6a971cf5d --- /dev/null +++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyReadOnlyAppService.cs @@ -0,0 +1,185 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Text; +using System.Threading.Tasks; + +using Volo.Abp.Application.Dtos; +using Volo.Abp.Auditing; +using Volo.Abp.Domain.Entities; +using Volo.Abp.Domain.Repositories; + +namespace Volo.Abp.Application.Services +{ + public abstract class AbstractKeyReadOnlyAppService + : AbstractKeyReadOnlyAppService + where TEntity : class, IEntity + { + protected AbstractKeyReadOnlyAppService(IRepository repository) + : base(repository) + { + } + } + + public abstract class AbstractKeyReadOnlyAppService + : AbstractKeyReadOnlyAppService + where TEntity : class, IEntity + { + protected AbstractKeyReadOnlyAppService(IRepository repository) + : base(repository) + { + } + } + + public abstract class AbstractKeyReadOnlyAppService + : ApplicationService + , IReadOnlyAppService + where TEntity : class, IEntity + { + protected IRepository Repository { get; } + + protected virtual string GetPolicyName { get; set; } + + protected virtual string GetListPolicyName { get; set; } + + protected AbstractKeyReadOnlyAppService(IRepository repository) + { + Repository = repository; + } + + public virtual async Task GetAsync(TKey id) + { + await CheckGetPolicyAsync(); + + var entity = await GetEntityByIdAsync(id); + return MapToGetOutputDto(entity); + } + + public virtual async Task> GetListAsync(TGetListInput input) + { + await CheckGetListPolicyAsync(); + + var query = CreateFilteredQuery(input); + + var totalCount = await AsyncExecuter.CountAsync(query); + + query = ApplySorting(query, input); + query = ApplyPaging(query, input); + + var entities = await AsyncExecuter.ToListAsync(query); + + return new PagedResultDto( + totalCount, + entities.Select(MapToGetListOutputDto).ToList() + ); + } + + protected abstract Task GetEntityByIdAsync(TKey id); + + protected virtual async Task CheckGetPolicyAsync() + { + await CheckPolicyAsync(GetPolicyName); + } + + protected virtual async Task CheckGetListPolicyAsync() + { + await CheckPolicyAsync(GetListPolicyName); + } + + /// + /// Should apply sorting if needed. + /// + /// The query. + /// The input. + protected virtual IQueryable ApplySorting(IQueryable query, TGetListInput input) + { + //Try to sort query if available + if (input is ISortedResultRequest sortInput) + { + if (!sortInput.Sorting.IsNullOrWhiteSpace()) + { + return query.OrderBy(sortInput.Sorting); + } + } + + //IQueryable.Task requires sorting, so we should sort if Take will be used. + if (input is ILimitedResultRequest) + { + return ApplyDefaultSorting(query); + } + + //No sorting + return query; + } + + /// + /// Applies sorting if no sorting specified but a limited result requested. + /// + /// The query. + protected virtual IQueryable ApplyDefaultSorting(IQueryable query) + { + if (typeof(TEntity).IsAssignableTo()) + { + return query.OrderByDescending(e => ((ICreationAuditedObject)e).CreationTime); + } + + throw new AbpException("No sorting specified but this query requires sorting. Override the ApplyDefaultSorting method for your application service derived from AbstractKeyCrudAppService!"); + } + + /// + /// Should apply paging if needed. + /// + /// The query. + /// The input. + protected virtual IQueryable ApplyPaging(IQueryable query, TGetListInput input) + { + //Try to use paging if available + if (input is IPagedResultRequest pagedInput) + { + return query.PageBy(pagedInput); + } + + //Try to limit query result if available + if (input is ILimitedResultRequest limitedInput) + { + return query.Take(limitedInput.MaxResultCount); + } + + //No paging + return query; + } + + /// + /// This method should create based on given input. + /// It should filter query if needed, but should not do sorting or paging. + /// Sorting should be done in and paging should be done in + /// methods. + /// + /// The input. + protected virtual IQueryable CreateFilteredQuery(TGetListInput input) + { + return Repository; + } + + /// + /// Maps to . + /// It uses by default. + /// It can be overriden for custom mapping. + /// + protected virtual TGetOutputDto MapToGetOutputDto(TEntity entity) + { + return ObjectMapper.Map(entity); + } + + /// + /// Maps to . + /// It uses by default. + /// It can be overriden for custom mapping. + /// + protected virtual TGetListOutputDto MapToGetListOutputDto(TEntity entity) + { + return ObjectMapper.Map(entity); + } + } +} diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ReadOnlyAppService.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ReadOnlyAppService.cs new file mode 100644 index 0000000000..b1176dca85 --- /dev/null +++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ReadOnlyAppService.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Volo.Abp.Application.Dtos; +using Volo.Abp.Auditing; +using Volo.Abp.Domain.Entities; +using Volo.Abp.Domain.Repositories; + +namespace Volo.Abp.Application.Services +{ + public abstract class ReadOnlyAppService + : AbstractKeyReadOnlyAppService + where TEntity : class, IEntity + where TGetOutputDto : IEntityDto + where TGetListOutputDto : IEntityDto + { + protected new IRepository Repository { get; } + + protected ReadOnlyAppService(IRepository repository) + : base(repository) + { + Repository = repository; + } + + protected override async Task GetEntityByIdAsync(TKey id) + { + return await Repository.GetAsync(id); + } + + protected override IQueryable ApplyDefaultSorting(IQueryable query) + { + if (typeof(TEntity).IsAssignableTo()) + { + return query.OrderByDescending(e => ((ICreationAuditedObject)e).CreationTime); + } + else + { + return query.OrderByDescending(e => e.Id); + } + } + } +} From 85ec7f2e39e5030a6ba1f347df182ced18da8fda Mon Sep 17 00:00:00 2001 From: Necati Meral Date: Sun, 14 Jun 2020 22:20:21 +0200 Subject: [PATCH 003/190] Updated inheritance chain --- .../Services/AbstractKeyCrudAppService.cs | 163 ++---------------- 1 file changed, 10 insertions(+), 153 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs index e6f433cad6..0fea4c31a5 100644 --- a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs @@ -2,6 +2,7 @@ using System.Linq; using System.Linq.Dynamic.Core; using System.Threading.Tasks; + using Volo.Abp.Application.Dtos; using Volo.Abp.Auditing; using Volo.Abp.Domain.Entities; @@ -61,17 +62,10 @@ namespace Volo.Abp.Application.Services } public abstract class AbstractKeyCrudAppService - : ApplicationService, - ICrudAppService + : AbstractKeyReadOnlyAppService + , ICrudAppService where TEntity : class, IEntity { - - protected IRepository Repository { get; } - - protected virtual string GetPolicyName { get; set; } - - protected virtual string GetListPolicyName { get; set; } - protected virtual string CreatePolicyName { get; set; } protected virtual string UpdatePolicyName { get; set; } @@ -79,35 +73,9 @@ namespace Volo.Abp.Application.Services protected virtual string DeletePolicyName { get; set; } protected AbstractKeyCrudAppService(IRepository repository) + : base(repository) { - Repository = repository; - } - - public virtual async Task GetAsync(TKey id) - { - await CheckGetPolicyAsync(); - - var entity = await GetEntityByIdAsync(id); - return MapToGetOutputDto(entity); - } - - public virtual async Task> GetListAsync(TGetListInput input) - { - await CheckGetListPolicyAsync(); - var query = CreateFilteredQuery(input); - - var totalCount = await AsyncExecuter.CountAsync(query); - - query = ApplySorting(query, input); - query = ApplyPaging(query, input); - - var entities = await AsyncExecuter.ToListAsync(query); - - return new PagedResultDto( - totalCount, - entities.Select(MapToGetListOutputDto).ToList() - ); } public virtual async Task CreateAsync(TCreateInput input) @@ -144,18 +112,6 @@ namespace Volo.Abp.Application.Services protected abstract Task DeleteByIdAsync(TKey id); - protected abstract Task GetEntityByIdAsync(TKey id); - - protected virtual async Task CheckGetPolicyAsync() - { - await CheckPolicyAsync(GetPolicyName); - } - - protected virtual async Task CheckGetListPolicyAsync() - { - await CheckPolicyAsync(GetListPolicyName); - } - protected virtual async Task CheckCreatePolicyAsync() { await CheckPolicyAsync(CreatePolicyName); @@ -171,101 +127,6 @@ namespace Volo.Abp.Application.Services await CheckPolicyAsync(DeletePolicyName); } - /// - /// Should apply sorting if needed. - /// - /// The query. - /// The input. - protected virtual IQueryable ApplySorting(IQueryable query, TGetListInput input) - { - //Try to sort query if available - if (input is ISortedResultRequest sortInput) - { - if (!sortInput.Sorting.IsNullOrWhiteSpace()) - { - return query.OrderBy(sortInput.Sorting); - } - } - - //IQueryable.Task requires sorting, so we should sort if Take will be used. - if (input is ILimitedResultRequest) - { - return ApplyDefaultSorting(query); - } - - //No sorting - return query; - } - - /// - /// Applies sorting if no sorting specified but a limited result requested. - /// - /// The query. - protected virtual IQueryable ApplyDefaultSorting(IQueryable query) - { - if (typeof(TEntity).IsAssignableTo()) - { - return query.OrderByDescending(e => ((ICreationAuditedObject)e).CreationTime); - } - - throw new AbpException("No sorting specified but this query requires sorting. Override the ApplyDefaultSorting method for your application service derived from AbstractKeyCrudAppService!"); - } - - /// - /// Should apply paging if needed. - /// - /// The query. - /// The input. - protected virtual IQueryable ApplyPaging(IQueryable query, TGetListInput input) - { - //Try to use paging if available - if (input is IPagedResultRequest pagedInput) - { - return query.PageBy(pagedInput); - } - - //Try to limit query result if available - if (input is ILimitedResultRequest limitedInput) - { - return query.Take(limitedInput.MaxResultCount); - } - - //No paging - return query; - } - - /// - /// This method should create based on given input. - /// It should filter query if needed, but should not do sorting or paging. - /// Sorting should be done in and paging should be done in - /// methods. - /// - /// The input. - protected virtual IQueryable CreateFilteredQuery(TGetListInput input) - { - return Repository; - } - - /// - /// Maps to . - /// It uses by default. - /// It can be overriden for custom mapping. - /// - protected virtual TGetOutputDto MapToGetOutputDto(TEntity entity) - { - return ObjectMapper.Map(entity); - } - - /// - /// Maps to . - /// It uses by default. - /// It can be overriden for custom mapping. - /// - protected virtual TGetListOutputDto MapToGetListOutputDto(TEntity entity) - { - return ObjectMapper.Map(entity); - } - /// /// Maps to to create a new entity. /// It uses by default. @@ -284,18 +145,14 @@ namespace Volo.Abp.Application.Services /// protected virtual void SetIdForGuids(TEntity entity) { - var entityWithGuidId = entity as IEntity; - - if (entityWithGuidId == null || entityWithGuidId.Id != Guid.Empty) + if (entity is IEntity entityWithGuidId && entityWithGuidId.Id == Guid.Empty) { - return; + EntityHelper.TrySetId( + entityWithGuidId, + () => GuidGenerator.Create(), + true + ); } - - EntityHelper.TrySetId( - entityWithGuidId, - () => GuidGenerator.Create(), - true - ); } /// From e42586db496ba2f7dc5e3e55fd263ac825459b74 Mon Sep 17 00:00:00 2001 From: Necati Meral Date: Sun, 14 Jun 2020 22:25:16 +0200 Subject: [PATCH 004/190] code format --- .../Abp/Application/Services/ICreateUpdateAppService.cs | 6 +++--- .../Volo/Abp/Application/Services/ICrudAppService.cs | 8 ++++---- .../Abp/Application/Services/AbstractKeyCrudAppService.cs | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICreateUpdateAppService.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICreateUpdateAppService.cs index 12362e9b73..22bf77ca96 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICreateUpdateAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICreateUpdateAppService.cs @@ -17,9 +17,9 @@ namespace Volo.Abp.Application.Services } public interface ICreateUpdateAppService - : ICreateAppService - , IUpdateAppService - , IApplicationService + : ICreateAppService, + IUpdateAppService, + IApplicationService { } diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICrudAppService.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICrudAppService.cs index b3b873cd5b..b866ce0ed9 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICrudAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICrudAppService.cs @@ -29,10 +29,10 @@ namespace Volo.Abp.Application.Services } public interface ICrudAppService - : IReadOnlyAppService - , ICreateUpdateAppService - , IDeleteAppService - , IApplicationService + : IReadOnlyAppService, + ICreateUpdateAppService, + IDeleteAppService, + IApplicationService { } diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs index 0fea4c31a5..9f234fbc3a 100644 --- a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs @@ -62,8 +62,8 @@ namespace Volo.Abp.Application.Services } public abstract class AbstractKeyCrudAppService - : AbstractKeyReadOnlyAppService - , ICrudAppService + : AbstractKeyReadOnlyAppService, + ICrudAppService where TEntity : class, IEntity { protected virtual string CreatePolicyName { get; set; } From 903faa6733a139cb3d66c6d9dbba42a1e7a0c3a0 Mon Sep 17 00:00:00 2001 From: Necati Meral Date: Sun, 14 Jun 2020 22:30:02 +0200 Subject: [PATCH 005/190] Added convenience classes --- .../Services/ReadOnlyAppService.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ReadOnlyAppService.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ReadOnlyAppService.cs index b1176dca85..69f1fd5077 100644 --- a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ReadOnlyAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ReadOnlyAppService.cs @@ -11,6 +11,26 @@ using Volo.Abp.Domain.Repositories; namespace Volo.Abp.Application.Services { + public abstract class ReadOnlyAppService + : ReadOnlyAppService + where TEntity : class, IEntity + where TEntityDto : IEntityDto + { + protected ReadOnlyAppService(IRepository repository) : base(repository) + { + } + } + + public abstract class ReadOnlyAppService + : ReadOnlyAppService + where TEntity : class, IEntity + where TEntityDto : IEntityDto + { + protected ReadOnlyAppService(IRepository repository) : base(repository) + { + } + } + public abstract class ReadOnlyAppService : AbstractKeyReadOnlyAppService where TEntity : class, IEntity From 34e3b992840cd01a85149c3bfccc08ca11f5f478 Mon Sep 17 00:00:00 2001 From: Necati Meral Date: Wed, 17 Jun 2020 18:27:14 +0200 Subject: [PATCH 006/190] Resolved code review issues by @liangshiw --- .../Volo/Abp/Application/Services/ICreateAppService.cs | 5 +---- .../Abp/Application/Services/ICreateUpdateAppService.cs | 9 ++------- .../Volo/Abp/Application/Services/ICrudAppService.cs | 5 +---- .../Volo/Abp/Application/Services/IDeleteAppService.cs | 5 +---- .../Volo/Abp/Application/Services/IReadOnlyAppService.cs | 6 ++---- .../Volo/Abp/Application/Services/IUpdateAppService.cs | 5 +---- 6 files changed, 8 insertions(+), 27 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICreateAppService.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICreateAppService.cs index bd9a4f4620..a5d75b0b4b 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICreateAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICreateAppService.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading.Tasks; +using System.Threading.Tasks; namespace Volo.Abp.Application.Services { diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICreateUpdateAppService.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICreateUpdateAppService.cs index 22bf77ca96..ce3698405c 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICreateUpdateAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICreateUpdateAppService.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Volo.Abp.Application.Services +namespace Volo.Abp.Application.Services { public interface ICreateUpdateAppService : ICreateUpdateAppService @@ -18,8 +14,7 @@ namespace Volo.Abp.Application.Services public interface ICreateUpdateAppService : ICreateAppService, - IUpdateAppService, - IApplicationService + IUpdateAppService { } diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICrudAppService.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICrudAppService.cs index b866ce0ed9..10f88db22a 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICrudAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/ICrudAppService.cs @@ -1,5 +1,3 @@ -using System.Threading.Tasks; - using Volo.Abp.Application.Dtos; namespace Volo.Abp.Application.Services @@ -31,8 +29,7 @@ namespace Volo.Abp.Application.Services public interface ICrudAppService : IReadOnlyAppService, ICreateUpdateAppService, - IDeleteAppService, - IApplicationService + IDeleteAppService { } diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IDeleteAppService.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IDeleteAppService.cs index 0a70e2a95e..50badcead9 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IDeleteAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IDeleteAppService.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading.Tasks; +using System.Threading.Tasks; namespace Volo.Abp.Application.Services { diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IReadOnlyAppService.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IReadOnlyAppService.cs index 2f4ad1b9c7..eb03faffe3 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IReadOnlyAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IReadOnlyAppService.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading.Tasks; +using System.Threading.Tasks; using Volo.Abp.Application.Dtos; @@ -20,6 +17,7 @@ namespace Volo.Abp.Application.Services } public interface IReadOnlyAppService + : IApplicationService { Task GetAsync(TKey id); diff --git a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IUpdateAppService.cs b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IUpdateAppService.cs index 043050b170..c0904709bf 100644 --- a/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IUpdateAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Services/IUpdateAppService.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading.Tasks; +using System.Threading.Tasks; namespace Volo.Abp.Application.Services { From 24e727ec4a6e5049c7eda277e4e4ec413c610a14 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 18 Jun 2020 18:07:00 +0300 Subject: [PATCH 007/190] chore: remove nav-item.utils --- .../theme-shared/src/lib/utils/index.ts | 1 - .../theme-shared/src/lib/utils/nav-items.ts | 22 ------------------- 2 files changed, 23 deletions(-) delete mode 100644 npm/ng-packs/packages/theme-shared/src/lib/utils/nav-items.ts diff --git a/npm/ng-packs/packages/theme-shared/src/lib/utils/index.ts b/npm/ng-packs/packages/theme-shared/src/lib/utils/index.ts index f1d694dded..9f290b5ca3 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/utils/index.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/utils/index.ts @@ -1,4 +1,3 @@ export * from './date-parser-formatter'; -export * from './nav-items'; export * from './validation-utils'; export * from './widget-utils'; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/utils/nav-items.ts b/npm/ng-packs/packages/theme-shared/src/lib/utils/nav-items.ts deleted file mode 100644 index b6b002a151..0000000000 --- a/npm/ng-packs/packages/theme-shared/src/lib/utils/nav-items.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Type } from '@angular/core'; -import { ReplaySubject } from 'rxjs'; - -export interface NavItem { - component?: Type; - html?: string; - action?: () => void; - order?: number; - permission?: string; -} - -const navItems: NavItem[] = []; -const navItems$ = new ReplaySubject(1); - -export function addNavItem(item: NavItem) { - navItems.push(item); - navItems$.next(navItems.sort((a, b) => (a.order ? a.order - b.order : 1))); -} - -export function getNavItems() { - return navItems$.asObservable(); -} From 32cb41de7e5ad07b83ec788c454ef2a53e7ccf0c Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 18 Jun 2020 18:07:31 +0300 Subject: [PATCH 008/190] feat(theme-shared): create nav-items.service --- .../theme-shared/src/lib/services/index.ts | 1 + .../src/lib/services/nav-items.service.ts | 49 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/services/nav-items.service.ts diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/index.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/index.ts index c363a56894..29a2ca9668 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/index.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/index.ts @@ -1,3 +1,4 @@ export * from './confirmation.service'; export * from './modal.service'; export * from './toaster.service'; +export * from './nav-items.service'; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/nav-items.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/nav-items.service.ts new file mode 100644 index 0000000000..95403837fd --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/nav-items.service.ts @@ -0,0 +1,49 @@ +import { Injectable } from '@angular/core'; +import { BehaviorSubject, Observable } from 'rxjs'; +import { NavItem } from '../models/nav-item'; + +@Injectable({ providedIn: 'root' }) +export class NavItemsService { + private _items$ = new BehaviorSubject([]); + + get items(): NavItem[] { + return this._items$.value; + } + + get items$(): Observable { + return this._items$.asObservable(); + } + + addItems(items: NavItem[]) { + this._items$.next([...this.items, ...items].sort(sortItems)); + } + + removeItem(id: string | number) { + const index = this.items.findIndex(item => item.id === id); + + if (index > -1) { + this._items$.next([...this.items.slice(0, index), ...this.items.slice(index + 1)]); + } + } + + patchItem(id: string | number, item: Partial>) { + const index = this.items.findIndex(i => i.id === id); + + if (index > -1) { + this._items$.next( + [ + ...this.items.slice(0, index), + { ...this.items[index], ...item }, + ...this.items.slice(index + 1), + ].sort(sortItems), + ); + } + } +} + +function sortItems(a: NavItem, b: NavItem) { + if (!a.order) return 1; + if (!b.order) return -1; + + return a.order < b.order ? -1 : 1; +} From f2cb8a00b60740d77f7f43735c53509e73701eb3 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 18 Jun 2020 18:07:50 +0300 Subject: [PATCH 009/190] feat: create nav-item interface --- .../packages/theme-shared/src/lib/models/index.ts | 1 + .../packages/theme-shared/src/lib/models/nav-item.ts | 10 ++++++++++ 2 files changed, 11 insertions(+) create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/models/nav-item.ts diff --git a/npm/ng-packs/packages/theme-shared/src/lib/models/index.ts b/npm/ng-packs/packages/theme-shared/src/lib/models/index.ts index 628ce6d80d..d1e2e71c5c 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/models/index.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/models/index.ts @@ -2,3 +2,4 @@ export * from './common'; export * from './confirmation'; export * from './statistics'; export * from './toaster'; +export * from './nav-item'; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/models/nav-item.ts b/npm/ng-packs/packages/theme-shared/src/lib/models/nav-item.ts new file mode 100644 index 0000000000..ea3d5c45a2 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/models/nav-item.ts @@ -0,0 +1,10 @@ +import { Type } from '@angular/core'; + +export interface NavItem { + id: string | number; + component?: Type; + html?: string; + action?: () => void; + order?: number; + requiredPolicy?: string; +} From 79afc3e6aba0358e670f0e4d9d0e10fe51509219 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 18 Jun 2020 18:08:12 +0300 Subject: [PATCH 010/190] chore: remove layout state --- .../theme-basic/src/lib/actions/index.ts | 1 - .../src/lib/actions/layout.actions.ts | 11 --- .../src/lib/services/layout-state.service.ts | 24 ------- .../theme-basic/src/lib/states/index.ts | 1 - .../src/lib/states/layout.state.ts | 67 ------------------- .../lib/tests/layout-state.service.spec.ts | 57 ---------------- .../theme-basic/src/lib/theme-basic.module.ts | 23 ++++--- .../packages/theme-basic/src/public-api.ts | 2 - 8 files changed, 13 insertions(+), 173 deletions(-) delete mode 100644 npm/ng-packs/packages/theme-basic/src/lib/actions/index.ts delete mode 100644 npm/ng-packs/packages/theme-basic/src/lib/actions/layout.actions.ts delete mode 100644 npm/ng-packs/packages/theme-basic/src/lib/services/layout-state.service.ts delete mode 100644 npm/ng-packs/packages/theme-basic/src/lib/states/index.ts delete mode 100644 npm/ng-packs/packages/theme-basic/src/lib/states/layout.state.ts delete mode 100644 npm/ng-packs/packages/theme-basic/src/lib/tests/layout-state.service.spec.ts diff --git a/npm/ng-packs/packages/theme-basic/src/lib/actions/index.ts b/npm/ng-packs/packages/theme-basic/src/lib/actions/index.ts deleted file mode 100644 index 2e29080de8..0000000000 --- a/npm/ng-packs/packages/theme-basic/src/lib/actions/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './layout.actions'; diff --git a/npm/ng-packs/packages/theme-basic/src/lib/actions/layout.actions.ts b/npm/ng-packs/packages/theme-basic/src/lib/actions/layout.actions.ts deleted file mode 100644 index 3786ea82b7..0000000000 --- a/npm/ng-packs/packages/theme-basic/src/lib/actions/layout.actions.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Layout } from '../models/layout'; - -export class AddNavigationElement { - static readonly type = '[Layout] Add Navigation Element'; - constructor(public payload: Layout.NavigationElement | Layout.NavigationElement[]) {} -} - -export class RemoveNavigationElementByName { - static readonly type = '[Layout] Remove Navigation ElementByName'; - constructor(public name: string) {} -} diff --git a/npm/ng-packs/packages/theme-basic/src/lib/services/layout-state.service.ts b/npm/ng-packs/packages/theme-basic/src/lib/services/layout-state.service.ts deleted file mode 100644 index 415cef61d3..0000000000 --- a/npm/ng-packs/packages/theme-basic/src/lib/services/layout-state.service.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Store } from '@ngxs/store'; -import { LayoutState } from '../states/layout.state'; -import { AddNavigationElement, RemoveNavigationElementByName } from '../actions'; -import { Layout } from '../models/layout'; - -@Injectable({ providedIn: 'root' }) -export class LayoutStateService { - constructor(private store: Store) {} - - getNavigationElements() { - return this.store.selectSnapshot(LayoutState.getNavigationElements); - } - - dispatchAddNavigationElement(...args: ConstructorParameters) { - return this.store.dispatch(new AddNavigationElement(...args)); - } - - dispatchRemoveNavigationElementByName( - ...args: ConstructorParameters - ) { - return this.store.dispatch(new RemoveNavigationElementByName(...args)); - } -} diff --git a/npm/ng-packs/packages/theme-basic/src/lib/states/index.ts b/npm/ng-packs/packages/theme-basic/src/lib/states/index.ts deleted file mode 100644 index 1e257fc64c..0000000000 --- a/npm/ng-packs/packages/theme-basic/src/lib/states/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './layout.state'; diff --git a/npm/ng-packs/packages/theme-basic/src/lib/states/layout.state.ts b/npm/ng-packs/packages/theme-basic/src/lib/states/layout.state.ts deleted file mode 100644 index 93f4352d69..0000000000 --- a/npm/ng-packs/packages/theme-basic/src/lib/states/layout.state.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Action, Selector, State, StateContext } from '@ngxs/store'; -import snq from 'snq'; -import { AddNavigationElement, RemoveNavigationElementByName } from '../actions/layout.actions'; -import { Layout } from '../models/layout'; - -@State({ - name: 'LayoutState', - defaults: { navigationElements: [] } as Layout.State, -}) -@Injectable() -export class LayoutState { - @Selector() - static getNavigationElements({ navigationElements }: Layout.State): Layout.NavigationElement[] { - return navigationElements; - } - - @Action(AddNavigationElement) - layoutAddAction( - { getState, patchState }: StateContext, - { payload = [] }: AddNavigationElement, - ) { - let { navigationElements } = getState(); - - if (!Array.isArray(payload)) { - payload = [payload]; - } - - if (navigationElements.length) { - payload = snq( - () => - (payload as Layout.NavigationElement[]).filter( - ({ name }) => navigationElements.findIndex(nav => nav.name === name) < 0, - ), - [], - ); - } - - if (!payload.length) return; - - navigationElements = [...navigationElements, ...payload] - .map(element => ({ ...element, order: element.order || 99 })) - .sort((a, b) => a.order - b.order); - - return patchState({ - navigationElements, - }); - } - - @Action(RemoveNavigationElementByName) - layoutRemoveAction( - { getState, patchState }: StateContext, - { name }: RemoveNavigationElementByName, - ) { - let { navigationElements } = getState(); - - const index = navigationElements.findIndex(element => element.name === name); - - if (index > -1) { - navigationElements = navigationElements.splice(index, 1); - } - - return patchState({ - navigationElements, - }); - } -} diff --git a/npm/ng-packs/packages/theme-basic/src/lib/tests/layout-state.service.spec.ts b/npm/ng-packs/packages/theme-basic/src/lib/tests/layout-state.service.spec.ts deleted file mode 100644 index de4f489aaa..0000000000 --- a/npm/ng-packs/packages/theme-basic/src/lib/tests/layout-state.service.spec.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { createServiceFactory, SpectatorService, SpyObject } from '@ngneat/spectator/jest'; -import { Store } from '@ngxs/store'; -import * as LayoutActions from '../actions'; -import { LayoutStateService } from '../services/layout-state.service'; -import { LayoutState } from '../states/layout.state'; -describe('LayoutStateService', () => { - let service: LayoutStateService; - let spectator: SpectatorService; - let store: SpyObject; - - const createService = createServiceFactory({ service: LayoutStateService, mocks: [Store] }); - beforeEach(() => { - spectator = createService(); - service = spectator.service; - store = spectator.get(Store); - }); - - test('should have the all LayoutState static methods', () => { - const reg = /(?<=static )(.*)(?=\()/gm; - LayoutState.toString() - .match(reg) - .forEach(fnName => { - expect(service[fnName]).toBeTruthy(); - - const spy = jest.spyOn(store, 'selectSnapshot'); - spy.mockClear(); - - const isDynamicSelector = LayoutState[fnName].name !== 'memoized'; - - if (isDynamicSelector) { - LayoutState[fnName] = jest.fn((...args) => args); - service[fnName]('test', 0, {}); - expect(LayoutState[fnName]).toHaveBeenCalledWith('test', 0, {}); - } else { - service[fnName](); - expect(spy).toHaveBeenCalledWith(LayoutState[fnName]); - } - }); - }); - - test('should have a dispatch method for every LayoutState action', () => { - const reg = /(?<=dispatch)(\w+)(?=\()/gm; - LayoutStateService.toString() - .match(reg) - .forEach(fnName => { - expect(LayoutActions[fnName]).toBeTruthy(); - - const spy = jest.spyOn(store, 'dispatch'); - spy.mockClear(); - - const params = Array.from(new Array(LayoutActions[fnName].length)); - - service[`dispatch${fnName}`](...params); - expect(spy).toHaveBeenCalledWith(new LayoutActions[fnName](...params)); - }); - }); -}); diff --git a/npm/ng-packs/packages/theme-basic/src/lib/theme-basic.module.ts b/npm/ng-packs/packages/theme-basic/src/lib/theme-basic.module.ts index 0a91c83fc7..cf94786e36 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/theme-basic.module.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/theme-basic.module.ts @@ -3,7 +3,6 @@ import { ThemeSharedModule } from '@abp/ng.theme.shared'; import { NgModule } from '@angular/core'; import { NgbCollapseModule, NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; import { NgxValidateCoreModule } from '@ngx-validate/core'; -import { NgxsModule } from '@ngxs/store'; import { AccountLayoutComponent } from './components/account-layout/account-layout.component'; import { ApplicationLayoutComponent } from './components/application-layout/application-layout.component'; import { EmptyLayoutComponent } from './components/empty-layout/empty-layout.component'; @@ -12,7 +11,8 @@ import { NavItemsComponent } from './components/nav-items/nav-items.component'; import { RoutesComponent } from './components/routes/routes.component'; import { ValidationErrorComponent } from './components/validation-error/validation-error.component'; import { InitialService } from './services/initial.service'; -import { LayoutState } from './states/layout.state'; +import { CurrentUserComponent } from './components/nav-items/current-user.component'; +import { LanguagesComponent } from './components/nav-items/languages.component'; export const LAYOUTS = [ApplicationLayoutComponent, AccountLayoutComponent, EmptyLayoutComponent]; @@ -23,6 +23,17 @@ export const LAYOUTS = [ApplicationLayoutComponent, AccountLayoutComponent, Empt LogoComponent, NavItemsComponent, RoutesComponent, + CurrentUserComponent, + LanguagesComponent, + ], + exports: [ + ...LAYOUTS, + ValidationErrorComponent, + LogoComponent, + NavItemsComponent, + RoutesComponent, + CurrentUserComponent, + LanguagesComponent, ], imports: [ CoreModule, @@ -30,7 +41,6 @@ export const LAYOUTS = [ApplicationLayoutComponent, AccountLayoutComponent, Empt NgbCollapseModule, NgbDropdownModule, NgxValidateCoreModule, - NgxsModule.forFeature([LayoutState]), NgxValidateCoreModule.forRoot({ targetSelector: '.form-group', blueprints: { @@ -52,13 +62,6 @@ export const LAYOUTS = [ApplicationLayoutComponent, AccountLayoutComponent, Empt errorTemplate: ValidationErrorComponent, }), ], - exports: [ - ...LAYOUTS, - ValidationErrorComponent, - LogoComponent, - NavItemsComponent, - RoutesComponent, - ], entryComponents: [...LAYOUTS, ValidationErrorComponent], }) export class ThemeBasicModule { diff --git a/npm/ng-packs/packages/theme-basic/src/public-api.ts b/npm/ng-packs/packages/theme-basic/src/public-api.ts index 580366dbcb..033a8d2d82 100644 --- a/npm/ng-packs/packages/theme-basic/src/public-api.ts +++ b/npm/ng-packs/packages/theme-basic/src/public-api.ts @@ -3,9 +3,7 @@ */ export * from './lib/theme-basic.module'; -export * from './lib/actions'; export * from './lib/components'; export * from './lib/enums'; export * from './lib/models'; export * from './lib/services'; -export * from './lib/states'; From 5c3aabda5de77150dd9d26432fc59ed8f7525c2b Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 18 Jun 2020 18:08:25 +0300 Subject: [PATCH 011/190] feat: create CurrentUserComponent --- .../nav-items/current-user.component.ts | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/current-user.component.ts diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/current-user.component.ts b/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/current-user.component.ts new file mode 100644 index 0000000000..70238d3538 --- /dev/null +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/current-user.component.ts @@ -0,0 +1,67 @@ +import { ApplicationConfiguration, AuthService, ConfigState } from '@abp/ng.core'; +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { Select } from '@ngxs/store'; +import { Observable } from 'rxjs'; + +@Component({ + selector: 'abp-current-user', + // tslint:disable-next-line: component-max-inline-declarations + template: ` + + {{ + 'AbpAccount::Login' | abpLocalization + }} + + + `, +}) +export class CurrentUserComponent implements OnInit { + @Select(ConfigState.getOne('currentUser')) + currentUser$: Observable; + + get smallScreen(): boolean { + return window.innerWidth < 992; + } + + constructor(private authService: AuthService, private router: Router) {} + + ngOnInit() {} + + logout() { + this.authService.logout().subscribe(() => { + this.router.navigate(['/'], { state: { redirectUrl: this.router.url } }); + }); + } +} From f9534214291d833dfb437c1c6e464b8c2b5449a2 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 18 Jun 2020 18:08:33 +0300 Subject: [PATCH 012/190] feat: create LanguagesComponent --- .../nav-items/languages.component.ts | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/languages.component.ts diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/languages.component.ts b/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/languages.component.ts new file mode 100644 index 0000000000..115e9e563e --- /dev/null +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/languages.component.ts @@ -0,0 +1,88 @@ +import { Component, OnInit, Input } from '@angular/core'; +import { Store, Select } from '@ngxs/store'; +import { SetLanguage, ConfigState, ApplicationConfiguration, SessionState } from '@abp/ng.core'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import snq from 'snq'; + +@Component({ + selector: 'abp-languages', + // tslint:disable-next-line: component-max-inline-declarations + template: ` + + `, +}) +export class LanguagesComponent implements OnInit { + get smallScreen(): boolean { + return window.innerWidth < 992; + } + + @Select(ConfigState.getDeep('localization.languages')) + languages$: Observable; + + get defaultLanguage$(): Observable { + return this.languages$.pipe( + map( + languages => + snq( + () => languages.find(lang => lang.cultureName === this.selectedLangCulture).displayName, + ), + '', + ), + ); + } + + get dropdownLanguages$(): Observable { + return this.languages$.pipe( + map( + languages => + snq(() => languages.filter(lang => lang.cultureName !== this.selectedLangCulture)), + [], + ), + ); + } + + get selectedLangCulture(): string { + return this.store.selectSnapshot(SessionState.getLanguage); + } + + constructor(private store: Store) {} + + ngOnInit() {} + + onChangeLang(cultureName: string) { + this.store.dispatch(new SetLanguage(cultureName)); + } +} From 2b3baba52aaed9f1316437ffb9f700887c92e389 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 18 Jun 2020 18:09:03 +0300 Subject: [PATCH 013/190] refactor: move languages and current user logics to related components --- .../theme-basic/src/lib/components/index.ts | 2 + .../nav-items/nav-items.component.html | 89 ++----------- .../nav-items/nav-items.component.ts | 123 +----------------- 3 files changed, 19 insertions(+), 195 deletions(-) diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/index.ts b/npm/ng-packs/packages/theme-basic/src/lib/components/index.ts index 06b6d5339c..6c4de6cf21 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/index.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/index.ts @@ -2,6 +2,8 @@ export * from './account-layout/account-layout.component'; export * from './application-layout/application-layout.component'; export * from './empty-layout/empty-layout.component'; export * from './logo/logo.component'; +export * from './nav-items/current-user.component'; +export * from './nav-items/languages.component'; export * from './nav-items/nav-items.component'; export * from './routes/routes.component'; export * from './validation-error/validation-error.component'; diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/nav-items.component.html b/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/nav-items.component.html index cb86773db5..955ccb8878 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/nav-items.component.html +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/nav-items.component.html @@ -1,81 +1,16 @@ - - - - + - + diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/nav-items.component.ts b/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/nav-items.component.ts index 6819807cd7..7a5ee9b37a 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/nav-items.component.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/nav-items.component.ts @@ -1,125 +1,12 @@ -import { - ABP, - ApplicationConfiguration, - AuthService, - ConfigState, - SessionState, - SetLanguage, - takeUntilDestroy, -} from '@abp/ng.core'; -import { - AfterViewInit, - Component, - Input, - OnDestroy, - TemplateRef, - TrackByFunction, - ViewChild, -} from '@angular/core'; -import { Navigate, RouterState } from '@ngxs/router-plugin'; -import { Select, Store } from '@ngxs/store'; -import compare from 'just-compare'; -import { Observable } from 'rxjs'; -import { filter, map } from 'rxjs/operators'; -import snq from 'snq'; -import { AddNavigationElement } from '../../actions/layout.actions'; -import { eNavigationElementNames } from '../../enums/navigation-element-names'; -import { Layout } from '../../models/layout'; -import { LayoutState } from '../../states/layout.state'; +import { NavItem, NavItemsService } from '@abp/ng.theme.shared'; +import { Component, Input, TrackByFunction } from '@angular/core'; @Component({ selector: 'abp-nav-items', templateUrl: 'nav-items.component.html', }) -export class NavItemsComponent implements AfterViewInit, OnDestroy { - @Select(LayoutState.getNavigationElements) - navElements$: Observable; +export class NavItemsComponent { + trackByFn: TrackByFunction = (_, element) => element.id; - @Select(ConfigState.getOne('currentUser')) - currentUser$: Observable; - - @Select(ConfigState.getDeep('localization.languages')) - languages$: Observable; - - @ViewChild('currentUser', { static: false, read: TemplateRef }) - currentUserRef: TemplateRef; - - @ViewChild('language', { static: false, read: TemplateRef }) - languageRef: TemplateRef; - - @Input() - smallScreen: boolean; - - rightPartElements: TemplateRef[] = []; - - trackByFn: TrackByFunction = (_, element) => element.name; - - get defaultLanguage$(): Observable { - return this.languages$.pipe( - map( - languages => - snq( - () => languages.find(lang => lang.cultureName === this.selectedLangCulture).displayName, - ), - '', - ), - ); - } - - get dropdownLanguages$(): Observable { - return this.languages$.pipe( - map( - languages => - snq(() => languages.filter(lang => lang.cultureName !== this.selectedLangCulture)), - [], - ), - ); - } - - get selectedLangCulture(): string { - return this.store.selectSnapshot(SessionState.getLanguage); - } - - constructor(private store: Store, private authService: AuthService) {} - - ngAfterViewInit() { - const navigations = this.store - .selectSnapshot(LayoutState.getNavigationElements) - .map(({ name }) => name); - - if (navigations.indexOf(eNavigationElementNames.Language) < 0) { - this.store.dispatch( - new AddNavigationElement([ - { element: this.languageRef, order: 4, name: eNavigationElementNames.Language }, - { element: this.currentUserRef, order: 5, name: eNavigationElementNames.User }, - ]), - ); - } - - this.navElements$ - .pipe( - map(elements => elements.map(({ element }) => element)), - filter(elements => !compare(elements, this.rightPartElements)), - takeUntilDestroy(this), - ) - .subscribe(elements => { - setTimeout(() => (this.rightPartElements = elements), 0); - }); - } - - ngOnDestroy() {} - - onChangeLang(cultureName: string) { - this.store.dispatch(new SetLanguage(cultureName)); - } - - logout() { - this.authService.logout().subscribe(() => { - this.store.dispatch( - new Navigate(['/'], null, { - state: { redirectUrl: this.store.selectSnapshot(RouterState).state.url }, - }), - ); - }); - } + constructor(public readonly navItems: NavItemsService) {} } From 6e2b64d776d898e8af166979ec31a669955680b1 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 18 Jun 2020 18:09:16 +0300 Subject: [PATCH 014/190] chore: remove an input --- .../application-layout/application-layout.component.html | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/application-layout/application-layout.component.html b/npm/ng-packs/packages/theme-basic/src/lib/components/application-layout/application-layout.component.html index c4acbec880..bb34ec33f6 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/application-layout/application-layout.component.html +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/application-layout/application-layout.component.html @@ -34,12 +34,8 @@ From 8e7018214bfc02d34b00025f4fe4d20cc9e25b51 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 18 Jun 2020 18:09:29 +0300 Subject: [PATCH 015/190] chore: remove eNavigationElementNames --- npm/ng-packs/packages/theme-basic/src/lib/enums/index.ts | 1 - .../theme-basic/src/lib/enums/navigation-element-names.ts | 4 ---- 2 files changed, 5 deletions(-) delete mode 100644 npm/ng-packs/packages/theme-basic/src/lib/enums/navigation-element-names.ts diff --git a/npm/ng-packs/packages/theme-basic/src/lib/enums/index.ts b/npm/ng-packs/packages/theme-basic/src/lib/enums/index.ts index 51f9e1ead1..07635cbbc8 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/enums/index.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/enums/index.ts @@ -1,2 +1 @@ export * from './components'; -export * from './navigation-element-names'; diff --git a/npm/ng-packs/packages/theme-basic/src/lib/enums/navigation-element-names.ts b/npm/ng-packs/packages/theme-basic/src/lib/enums/navigation-element-names.ts deleted file mode 100644 index 12aa3f0941..0000000000 --- a/npm/ng-packs/packages/theme-basic/src/lib/enums/navigation-element-names.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const enum eNavigationElementNames { - Language = 'LanguageRef', - User = 'CurrentUserRef', -} From a934c0f6bc81cfb2d5fa9b14005ef115a28193c9 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 18 Jun 2020 18:09:58 +0300 Subject: [PATCH 016/190] chore: add new component names to components enum --- npm/ng-packs/packages/theme-basic/src/lib/enums/components.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/npm/ng-packs/packages/theme-basic/src/lib/enums/components.ts b/npm/ng-packs/packages/theme-basic/src/lib/enums/components.ts index ab7aa86942..e62f551851 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/enums/components.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/enums/components.ts @@ -5,4 +5,6 @@ export const enum eThemeBasicComponents { Logo = 'Theme.LogoComponent', Routes = 'Theme.RoutesComponent', NavItems = 'Theme.NavItemsComponent', + CurrentUser = 'Theme.CurrentUserComponent', + Languages = 'Theme.LanguagesComponent', } From 5693a05b9fe91bacedbc0bc534dda62fe9291466 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 18 Jun 2020 18:10:27 +0300 Subject: [PATCH 017/190] feat: register current user and languages components to nav-items.service --- .../packages/theme-basic/src/lib/services/index.ts | 1 - .../src/lib/services/initial.service.ts | 14 +++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/theme-basic/src/lib/services/index.ts b/npm/ng-packs/packages/theme-basic/src/lib/services/index.ts index b904c4d663..5fb95808c9 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/services/index.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/services/index.ts @@ -1,2 +1 @@ export * from './initial.service'; -export * from './layout-state.service'; diff --git a/npm/ng-packs/packages/theme-basic/src/lib/services/initial.service.ts b/npm/ng-packs/packages/theme-basic/src/lib/services/initial.service.ts index c5bc93cbf0..5b02cf158e 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/services/initial.service.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/services/initial.service.ts @@ -6,10 +6,17 @@ import { ApplicationLayoutComponent } from '../components/application-layout/app import { AccountLayoutComponent } from '../components/account-layout/account-layout.component'; import { EmptyLayoutComponent } from '../components/empty-layout/empty-layout.component'; import { eThemeBasicComponents } from '../enums/components'; +import { NavItemsService } from '@abp/ng.theme.shared'; +import { LanguagesComponent } from '../components/nav-items/languages.component'; +import { CurrentUserComponent } from '../components/nav-items/current-user.component'; @Injectable({ providedIn: 'root' }) export class InitialService { - constructor(private domInsertion: DomInsertionService, private store: Store) { + constructor( + private domInsertion: DomInsertionService, + private navItemsService: NavItemsService, + private store: Store, + ) { this.appendStyle(); this.store.dispatch([ @@ -26,6 +33,11 @@ export class InitialService { component: EmptyLayoutComponent, }), ]); + + this.navItemsService.addItems([ + { id: eThemeBasicComponents.CurrentUser, component: CurrentUserComponent }, + { id: eThemeBasicComponents.Languages, component: LanguagesComponent }, + ]); } appendStyle() { From 5646dce18a6d59b92a8aaf0ac6c54c97c73ac4ea Mon Sep 17 00:00:00 2001 From: Necati Meral Date: Thu, 18 Jun 2020 21:01:46 +0200 Subject: [PATCH 018/190] Removed unused usings and unified code formatting --- .../Application/Services/AbstractKeyCrudAppService.cs | 4 ---- .../Services/AbstractKeyReadOnlyAppService.cs | 5 ++--- .../Volo/Abp/Application/Services/CrudAppService.cs | 2 +- .../Abp/Application/Services/ReadOnlyAppService.cs | 11 ++++++----- 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs index 9f234fbc3a..e79f0ce75f 100644 --- a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs @@ -1,10 +1,6 @@ using System; -using System.Linq; -using System.Linq.Dynamic.Core; using System.Threading.Tasks; - using Volo.Abp.Application.Dtos; -using Volo.Abp.Auditing; using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories; using Volo.Abp.MultiTenancy; diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyReadOnlyAppService.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyReadOnlyAppService.cs index c6a971cf5d..e6af5484a7 100644 --- a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyReadOnlyAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyReadOnlyAppService.cs @@ -1,10 +1,7 @@ using System; -using System.Collections.Generic; using System.Linq; using System.Linq.Dynamic.Core; -using System.Text; using System.Threading.Tasks; - using Volo.Abp.Application.Dtos; using Volo.Abp.Auditing; using Volo.Abp.Domain.Entities; @@ -19,6 +16,7 @@ namespace Volo.Abp.Application.Services protected AbstractKeyReadOnlyAppService(IRepository repository) : base(repository) { + } } @@ -29,6 +27,7 @@ namespace Volo.Abp.Application.Services protected AbstractKeyReadOnlyAppService(IRepository repository) : base(repository) { + } } diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/CrudAppService.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/CrudAppService.cs index a2af0592a4..7832e8a4ab 100644 --- a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/CrudAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/CrudAppService.cs @@ -70,7 +70,7 @@ namespace Volo.Abp.Application.Services protected new IRepository Repository { get; } protected CrudAppService(IRepository repository) - : base(repository) + : base(repository) { Repository = repository; } diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ReadOnlyAppService.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ReadOnlyAppService.cs index 69f1fd5077..0ddc4b4700 100644 --- a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ReadOnlyAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ReadOnlyAppService.cs @@ -1,9 +1,6 @@ using System; -using System.Collections.Generic; using System.Linq; -using System.Text; using System.Threading.Tasks; - using Volo.Abp.Application.Dtos; using Volo.Abp.Auditing; using Volo.Abp.Domain.Entities; @@ -16,8 +13,10 @@ namespace Volo.Abp.Application.Services where TEntity : class, IEntity where TEntityDto : IEntityDto { - protected ReadOnlyAppService(IRepository repository) : base(repository) + protected ReadOnlyAppService(IRepository repository) + : base(repository) { + } } @@ -26,8 +25,10 @@ namespace Volo.Abp.Application.Services where TEntity : class, IEntity where TEntityDto : IEntityDto { - protected ReadOnlyAppService(IRepository repository) : base(repository) + protected ReadOnlyAppService(IRepository repository) + : base(repository) { + } } From 7634aaf74be9458ecf10c8609ba63903c3684523 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 19 Jun 2020 10:27:53 +0300 Subject: [PATCH 019/190] feat: add route.provider to dev-app --- .../apps/dev-app/src/app/app.module.ts | 2 ++ .../apps/dev-app/src/app/route.provider.ts | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 npm/ng-packs/apps/dev-app/src/app/route.provider.ts diff --git a/npm/ng-packs/apps/dev-app/src/app/app.module.ts b/npm/ng-packs/apps/dev-app/src/app/app.module.ts index acf8fcaaa8..7c9e2781e2 100644 --- a/npm/ng-packs/apps/dev-app/src/app/app.module.ts +++ b/npm/ng-packs/apps/dev-app/src/app/app.module.ts @@ -13,6 +13,7 @@ import { environment } from '../environments/environment'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { SharedModule } from './shared/shared.module'; +import { APP_ROUTE_PROVIDER } from './route.provider'; const LOGGERS = [NgxsLoggerPluginModule.forRoot({ disabled: false })]; @@ -35,6 +36,7 @@ const LOGGERS = [NgxsLoggerPluginModule.forRoot({ disabled: false })]; SharedModule, ...(environment.production ? [] : LOGGERS), ], + providers: [APP_ROUTE_PROVIDER], declarations: [AppComponent], bootstrap: [AppComponent], }) diff --git a/npm/ng-packs/apps/dev-app/src/app/route.provider.ts b/npm/ng-packs/apps/dev-app/src/app/route.provider.ts new file mode 100644 index 0000000000..5a14ad7ba0 --- /dev/null +++ b/npm/ng-packs/apps/dev-app/src/app/route.provider.ts @@ -0,0 +1,20 @@ +import { RoutesService, eLayoutType } from '@abp/ng.core'; +import { APP_INITIALIZER } from '@angular/core'; + +export const APP_ROUTE_PROVIDER = [ + { provide: APP_INITIALIZER, useFactory: configureRoutes, deps: [RoutesService], multi: true }, +]; + +function configureRoutes(routes: RoutesService) { + return () => { + routes.add([ + { + path: '/', + name: '::Menu:Home', + iconClass: 'fas fa-home', + order: 1, + layout: eLayoutType.application, + }, + ]); + }; +} From 6395a6c65bcacfdfee4fc1b05ddc2697890600e1 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 19 Jun 2020 10:28:08 +0300 Subject: [PATCH 020/190] chore: remove ApplicationLayoutComponent from home-routing.module --- npm/ng-packs/apps/dev-app/src/app/home/home-routing.module.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/npm/ng-packs/apps/dev-app/src/app/home/home-routing.module.ts b/npm/ng-packs/apps/dev-app/src/app/home/home-routing.module.ts index 367affb583..634706a36c 100644 --- a/npm/ng-packs/apps/dev-app/src/app/home/home-routing.module.ts +++ b/npm/ng-packs/apps/dev-app/src/app/home/home-routing.module.ts @@ -1,12 +1,10 @@ import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; import { HomeComponent } from './home.component'; -import { ApplicationLayoutComponent } from '@abp/ng.theme.basic'; const routes: Routes = [ { path: '', - component: ApplicationLayoutComponent, children: [{ path: '', component: HomeComponent }], }, ]; From e88d5b4cba80e18a51ffe7bfdf83fdd59fdf04b8 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 19 Jun 2020 14:21:30 +0300 Subject: [PATCH 021/190] feat: define DynamicLayoutComponent in root level --- .../dev-app/src/app/app-routing.module.ts | 55 ++++++++++--------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/npm/ng-packs/apps/dev-app/src/app/app-routing.module.ts b/npm/ng-packs/apps/dev-app/src/app/app-routing.module.ts index be5089316a..8f6973079d 100644 --- a/npm/ng-packs/apps/dev-app/src/app/app-routing.module.ts +++ b/npm/ng-packs/apps/dev-app/src/app/app-routing.module.ts @@ -1,36 +1,37 @@ -import { ABP } from '@abp/ng.core'; +import { ABP, DynamicLayoutComponent } from '@abp/ng.core'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; const routes: Routes = [ { path: '', - loadChildren: () => import('./home/home.module').then(m => m.HomeModule), - data: { - routes: { - name: '::Menu:Home', - order: 1, - } as ABP.Route, - }, - }, - { - path: 'account', - loadChildren: () => - import('@abp/ng.account').then(m => m.AccountModule.forLazy({ redirectUrl: '/' })), - }, - { - path: 'identity', - loadChildren: () => import('@abp/ng.identity').then(m => m.IdentityModule.forLazy()), - }, - { - path: 'tenant-management', - loadChildren: () => - import('@abp/ng.tenant-management').then(m => m.TenantManagementModule.forLazy()), - }, - { - path: 'setting-management', - loadChildren: () => - import('@abp/ng.setting-management').then(m => m.SettingManagementModule.forLazy()), + component: DynamicLayoutComponent, + children: [ + { + path: '', + pathMatch: 'full', + loadChildren: () => import('./home/home.module').then(m => m.HomeModule), + }, + { + path: 'account', + loadChildren: () => + import('@abp/ng.account').then(m => m.AccountModule.forLazy({ redirectUrl: '/' })), + }, + { + path: 'identity', + loadChildren: () => import('@abp/ng.identity').then(m => m.IdentityModule.forLazy()), + }, + { + path: 'tenant-management', + loadChildren: () => + import('@abp/ng.tenant-management').then(m => m.TenantManagementModule.forLazy()), + }, + { + path: 'setting-management', + loadChildren: () => + import('@abp/ng.setting-management').then(m => m.SettingManagementModule.forLazy()), + }, + ], }, ]; From c0896e6806660bf894cf480a4abcd4210cd1b88b Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 19 Jun 2020 14:22:03 +0300 Subject: [PATCH 022/190] feat: check dynamic layout other instance --- .../core/src/lib/components/dynamic-layout.component.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts b/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts index 5455187086..d2248550d8 100644 --- a/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts +++ b/npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts @@ -1,4 +1,4 @@ -import { Component, Injector, OnDestroy, Type } from '@angular/core'; +import { Component, Injector, OnDestroy, Type, Optional, SkipSelf } from '@angular/core'; import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; import { Store } from '@ngxs/store'; import { eLayoutType } from '../enums/common'; @@ -28,7 +28,10 @@ export class DynamicLayoutComponent implements OnDestroy { private route: ActivatedRoute, private routes: RoutesService, private store: Store, + @Optional() @SkipSelf() dynamicLayoutComponent: DynamicLayoutComponent, ) { + if (dynamicLayoutComponent) return; + const router = injector.get(Router); const layouts = { application: this.getComponent('Theme.ApplicationLayoutComponent'), From 0508ebabef63c8585b12515c974b1420a63e1407 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 19 Jun 2020 14:22:19 +0300 Subject: [PATCH 023/190] chore: deprecate visibility.directive --- .../core/src/lib/directives/visibility.directive.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/core/src/lib/directives/visibility.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/visibility.directive.ts index 2dffa1532d..f5f4d22f5e 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/visibility.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/visibility.directive.ts @@ -2,6 +2,10 @@ import { Directive, Input, Optional, ElementRef, Renderer2, AfterViewInit } from import { Subject } from 'rxjs'; import snq from 'snq'; +/** + * + * @deprecated To be deleted in v3.3 + */ @Directive({ selector: '[abpVisibility]', }) @@ -40,7 +44,8 @@ export class VisibilityDirective implements AfterViewInit { setTimeout(() => { const htmlNodes = snq( - () => Array.from(this.focusedElement.childNodes).filter(node => node instanceof HTMLElement), + () => + Array.from(this.focusedElement.childNodes).filter(node => node instanceof HTMLElement), [], ); From c27791e52a4da175c492cb71d675eaf45ef78884 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 19 Jun 2020 14:22:40 +0300 Subject: [PATCH 024/190] feat: add findRequiredPolicy method to routes.component --- .../components/routes/routes.component.html | 5 ++- .../lib/components/routes/routes.component.ts | 35 +++++++++++++++++-- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/routes/routes.component.html b/npm/ng-packs/packages/theme-basic/src/lib/components/routes/routes.component.html index 4d22ddc8d2..60f2de6c1c 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/routes/routes.component.html +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/routes/routes.component.html @@ -18,8 +18,8 @@ public bool IsMultiTenant { get; set; } = true; + public ITypeList NamingNormalizerProviders { get; } + [NotNull] private readonly Dictionary _properties; [CanBeNull] private readonly BlobContainerConfiguration _fallbackConfiguration; public BlobContainerConfiguration(BlobContainerConfiguration fallbackConfiguration = null) { + NamingNormalizerProviders = new TypeList(); _fallbackConfiguration = fallbackConfiguration; _properties = new Dictionary(); } @@ -68,4 +72,4 @@ namespace Volo.Abp.BlobStoring return this; } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs index ab27aab01f..7a4da39ef9 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerFactory.cs @@ -1,4 +1,5 @@ -using Volo.Abp.DependencyInjection; +using System; +using Volo.Abp.DependencyInjection; using Volo.Abp.MultiTenancy; using Volo.Abp.Threading; @@ -7,36 +8,41 @@ namespace Volo.Abp.BlobStoring public class BlobContainerFactory : IBlobContainerFactory, ITransientDependency { protected IBlobProviderSelector ProviderSelector { get; } - + protected IBlobContainerConfigurationProvider ConfigurationProvider { get; } protected ICurrentTenant CurrentTenant { get; } - + protected ICancellationTokenProvider CancellationTokenProvider { get; } + protected IServiceProvider ServiceProvider { get; } + public BlobContainerFactory( IBlobContainerConfigurationProvider configurationProvider, ICurrentTenant currentTenant, - ICancellationTokenProvider cancellationTokenProvider, - IBlobProviderSelector providerSelector) + ICancellationTokenProvider cancellationTokenProvider, + IBlobProviderSelector providerSelector, + IServiceProvider serviceProvider) { ConfigurationProvider = configurationProvider; CurrentTenant = currentTenant; CancellationTokenProvider = cancellationTokenProvider; ProviderSelector = providerSelector; + ServiceProvider = serviceProvider; } - + public virtual IBlobContainer Create(string name) { var configuration = ConfigurationProvider.Get(name); - + return new BlobContainer( name, configuration, ProviderSelector.Get(name), CurrentTenant, - CancellationTokenProvider + CancellationTokenProvider, + ServiceProvider ); } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNamingNormalizerProvider.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNamingNormalizerProvider.cs new file mode 100644 index 0000000000..8c5bff81c4 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNamingNormalizerProvider.cs @@ -0,0 +1,9 @@ +namespace Volo.Abp.BlobStoring +{ + public interface IBlobNamingNormalizerProvider + { + string NormalizeContainerName(string containerName); + + string NormalizeBlobName(string blobName); + } +} diff --git a/framework/src/Volo.Abp.Core/System/Runtime/IOSPlatformProvider.cs b/framework/src/Volo.Abp.Core/System/Runtime/IOSPlatformProvider.cs new file mode 100644 index 0000000000..60240159f3 --- /dev/null +++ b/framework/src/Volo.Abp.Core/System/Runtime/IOSPlatformProvider.cs @@ -0,0 +1,9 @@ +using System.Runtime.InteropServices; + +namespace System.Runtime +{ + public interface IOSPlatformProvider + { + OSPlatform GetCurrentOSPlatform(); + } +} diff --git a/framework/src/Volo.Abp.Core/System/Runtime/OSPlatformProvider.cs b/framework/src/Volo.Abp.Core/System/Runtime/OSPlatformProvider.cs new file mode 100644 index 0000000000..d2b05aac60 --- /dev/null +++ b/framework/src/Volo.Abp.Core/System/Runtime/OSPlatformProvider.cs @@ -0,0 +1,29 @@ +using System.Runtime.InteropServices; +using Volo.Abp.DependencyInjection; + +namespace System.Runtime +{ + public class OSPlatformProvider : IOSPlatformProvider, ITransientDependency + { + public OSPlatform GetCurrentOSPlatform() + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + //MAC + return OSPlatform.OSX; + } + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + return OSPlatform.Linux; + } + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + return OSPlatform.Windows; + } + + throw new Exception("Cannot determine operating system!"); + } + } +} diff --git a/framework/test/Volo.Abp.BlobStoring.Azure.Tests/Volo/Abp/BlobStoring/Azure/DefaultAzureBlobNamingNormalizerProvider_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Azure.Tests/Volo/Abp/BlobStoring/Azure/DefaultAzureBlobNamingNormalizerProvider_Tests.cs new file mode 100644 index 0000000000..50e7e0b7ab --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Azure.Tests/Volo/Abp/BlobStoring/Azure/DefaultAzureBlobNamingNormalizerProvider_Tests.cs @@ -0,0 +1,57 @@ +using Shouldly; +using Xunit; + +namespace Volo.Abp.BlobStoring.Azure +{ + public class DefaultAzureBlobNamingNormalizerProvider_Tests : AbpBlobStoringAzureTestCommonBase + { + private readonly IBlobNamingNormalizerProvider _blobNamingNormalizerProvider; + + public DefaultAzureBlobNamingNormalizerProvider_Tests() + { + _blobNamingNormalizerProvider = GetRequiredService(); + } + + [Fact] + public void NormalizeContainerName_Lowercase() + { + var filename = "ThisIsMyContainerName"; + filename = _blobNamingNormalizerProvider.NormalizeContainerName(filename); + filename.ShouldBe("thisismycontainername"); + } + + [Fact] + public void NormalizeContainerName_Only_Letters_Numbers_Dash() + { + var filename = ",./this-i,./s-my-c,./ont,./ai+*/.=!@#$n^&*er-name.+/"; + filename = _blobNamingNormalizerProvider.NormalizeContainerName(filename); + filename.ShouldBe("this-is-my-container-name"); + } + + [Fact] + public void NormalizeContainerName_Dash() + { + var filename = "-this--is----my-container----name-"; + filename = _blobNamingNormalizerProvider.NormalizeContainerName(filename); + filename.ShouldBe("this-is-my-container-name"); + } + + + [Fact] + public void NormalizeContainerName_Min_Length() + { + var filename = "a"; + filename = _blobNamingNormalizerProvider.NormalizeContainerName(filename); + filename.Length.ShouldBeGreaterThanOrEqualTo(3); + } + + + [Fact] + public void NormalizeContainerName_Max_Length() + { + var filename = "abpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabp"; + filename = _blobNamingNormalizerProvider.NormalizeContainerName(filename); + filename.Length.ShouldBeLessThanOrEqualTo(63); + } + } +} diff --git a/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/DefaultFileSystemBlobNamingNormalizerProvider_Tests.cs b/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/DefaultFileSystemBlobNamingNormalizerProvider_Tests.cs new file mode 100644 index 0000000000..7b4282996c --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/DefaultFileSystemBlobNamingNormalizerProvider_Tests.cs @@ -0,0 +1,62 @@ +using System.Runtime; +using System.Runtime.InteropServices; +using Microsoft.Extensions.DependencyInjection; +using NSubstitute; +using Shouldly; +using Xunit; + +namespace Volo.Abp.BlobStoring.FileSystem +{ + public class DefaultFileSystemBlobNamingNormalizerProvider_Tests : AbpBlobStoringFileSystemTestBase + { + private readonly IBlobNamingNormalizerProvider _blobNamingNormalizerProvider; + + public DefaultFileSystemBlobNamingNormalizerProvider_Tests() + { + _blobNamingNormalizerProvider = GetRequiredService(); + } + + protected override void AfterAddApplication(IServiceCollection services) + { + var _iosPlatformProvider = Substitute.For(); + _iosPlatformProvider.GetCurrentOSPlatform().Returns(OSPlatform.Windows); + services.AddSingleton(_iosPlatformProvider); + } + + [Fact] + public void NormalizeContainerName() + { + var filename = "thisismy:*?\"<>|foldername"; + filename = _blobNamingNormalizerProvider.NormalizeContainerName(filename); + filename.ShouldBe("thisismyfoldername"); + } + + [Fact] + public void NormalizeBlobName() + { + var filename = "thisismy:*?\"<>|filename"; + filename = _blobNamingNormalizerProvider.NormalizeContainerName(filename); + filename.ShouldBe("thisismyfilename"); + } + + [Theory] + [InlineData("/")] + [InlineData("\\")] + public void NormalizeContainerName_With_Directory(string delimiter) + { + var filename = $"thisis{delimiter}my:*?\"<>|{delimiter}foldername"; + filename = _blobNamingNormalizerProvider.NormalizeContainerName(filename); + filename.ShouldBe($"thisis{delimiter}my{delimiter}foldername"); + } + + [Theory] + [InlineData("/")] + [InlineData("\\")] + public void NormalizeBlobName_With_Directory(string delimiter) + { + var filename = $"thisis{delimiter}my:*?\"<>|{delimiter}filename"; + filename = _blobNamingNormalizerProvider.NormalizeContainerName(filename); + filename.ShouldBe($"thisis{delimiter}my{delimiter}filename"); + } + } +} From 5fc43ffcf9dd601e54dc3332ba15ecfa571d90f5 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 23 Jun 2020 14:42:08 +0300 Subject: [PATCH 042/190] fix: remove whitelistedNonPeerDependencies --- npm/ng-packs/packages/theme-shared/extensions/ng-package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/extensions/ng-package.json b/npm/ng-packs/packages/theme-shared/extensions/ng-package.json index 37346b8d80..d6080a2993 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/ng-package.json +++ b/npm/ng-packs/packages/theme-shared/extensions/ng-package.json @@ -3,6 +3,5 @@ "dest": "../../dist/theme-shared/extensions", "lib": { "entryFile": "src/public-api.ts" - }, - "whitelistedNonPeerDependencies": ["@abp/ng.theme.shared"] + } } From 60f25eb03ae3a949ba42bfa117a781d04febb2a0 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 23 Jun 2020 14:42:29 +0300 Subject: [PATCH 043/190] build: add path for @abp/ng.theme.shared/extensions --- npm/ng-packs/tsconfig.json | 1 + 1 file changed, 1 insertion(+) diff --git a/npm/ng-packs/tsconfig.json b/npm/ng-packs/tsconfig.json index a8c1b3addb..02971ebe83 100644 --- a/npm/ng-packs/tsconfig.json +++ b/npm/ng-packs/tsconfig.json @@ -17,6 +17,7 @@ "paths": { "@abp/ng.core": ["packages/core/src/public-api.ts"], "@abp/ng.theme.shared": ["packages/theme-shared/src/public-api.ts"], + "@abp/ng.theme.shared/extensions": ["packages/theme-shared/src/public-api.ts"], "@abp/ng.theme.basic": ["packages/theme-basic/src/public-api.ts"], "@abp/ng.account": ["packages/account/src/public-api.ts"], "@abp/ng.account/config": ["packages/account/config/src/public-api.ts"], From f94706612c482aafba191217c65f937ad5d91cb2 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 23 Jun 2020 14:42:57 +0300 Subject: [PATCH 044/190] build: add ngcc configs per package --- npm/ng-packs/packages/account/ngcc.config.js | 7 +++++++ npm/ng-packs/packages/identity/ngcc.config.js | 7 +++++++ npm/ng-packs/packages/setting-management/ngcc.config.js | 7 +++++++ npm/ng-packs/packages/tenant-management/ngcc.config.js | 7 +++++++ npm/ng-packs/packages/theme-shared/ngcc.config.js | 7 +++++++ 5 files changed, 35 insertions(+) create mode 100644 npm/ng-packs/packages/account/ngcc.config.js create mode 100644 npm/ng-packs/packages/identity/ngcc.config.js create mode 100644 npm/ng-packs/packages/setting-management/ngcc.config.js create mode 100644 npm/ng-packs/packages/tenant-management/ngcc.config.js create mode 100644 npm/ng-packs/packages/theme-shared/ngcc.config.js diff --git a/npm/ng-packs/packages/account/ngcc.config.js b/npm/ng-packs/packages/account/ngcc.config.js new file mode 100644 index 0000000000..93f34d5655 --- /dev/null +++ b/npm/ng-packs/packages/account/ngcc.config.js @@ -0,0 +1,7 @@ +module.exports = { + entryPoints: { + '.': {}, + './config': {}, + './dist': { ignore: true }, + }, +}; diff --git a/npm/ng-packs/packages/identity/ngcc.config.js b/npm/ng-packs/packages/identity/ngcc.config.js new file mode 100644 index 0000000000..93f34d5655 --- /dev/null +++ b/npm/ng-packs/packages/identity/ngcc.config.js @@ -0,0 +1,7 @@ +module.exports = { + entryPoints: { + '.': {}, + './config': {}, + './dist': { ignore: true }, + }, +}; diff --git a/npm/ng-packs/packages/setting-management/ngcc.config.js b/npm/ng-packs/packages/setting-management/ngcc.config.js new file mode 100644 index 0000000000..93f34d5655 --- /dev/null +++ b/npm/ng-packs/packages/setting-management/ngcc.config.js @@ -0,0 +1,7 @@ +module.exports = { + entryPoints: { + '.': {}, + './config': {}, + './dist': { ignore: true }, + }, +}; diff --git a/npm/ng-packs/packages/tenant-management/ngcc.config.js b/npm/ng-packs/packages/tenant-management/ngcc.config.js new file mode 100644 index 0000000000..93f34d5655 --- /dev/null +++ b/npm/ng-packs/packages/tenant-management/ngcc.config.js @@ -0,0 +1,7 @@ +module.exports = { + entryPoints: { + '.': {}, + './config': {}, + './dist': { ignore: true }, + }, +}; diff --git a/npm/ng-packs/packages/theme-shared/ngcc.config.js b/npm/ng-packs/packages/theme-shared/ngcc.config.js new file mode 100644 index 0000000000..a7e9362f3f --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/ngcc.config.js @@ -0,0 +1,7 @@ +module.exports = { + entryPoints: { + '.': {}, + './extensions': {}, + './dist': { ignore: true }, + }, +}; From 57f01eea1e15280b5ee1559cfcdafc1bf22ff5fe Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 23 Jun 2020 14:43:23 +0300 Subject: [PATCH 045/190] build: update compile:ivy script --- npm/ng-packs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index 37476c4fd8..a5cf9861f3 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -19,7 +19,7 @@ "ci:test": "ng test --coverage=false", "ci:build": "cd scripts && yarn build:prod", "lerna": "lerna", - "compile:ivy": "ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points --tsconfig './tsconfig.prod.json'", + "compile:ivy": "yarn ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points --tsconfig './tsconfig.prod.json' --source node_modules --async false", "postinstall": "npm run compile:ivy" }, "devDependencies": { From 94bf601537d75b16e7ba5705d850be1cc969547e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ak=C4=B1n=20Sabri=20=C3=87am?= Date: Tue, 23 Jun 2020 18:07:34 +0300 Subject: [PATCH 046/190] added abp tag helpers and refactored search button --- .../AbpPageSearchBox/AbpPageSearchBoxViewComponent.cs | 3 +-- .../Shared/Components/AbpPageSearchBox/Default.cshtml | 10 +++++++--- .../Components/AbpPageSearchBox/_ViewImports.cshtml | 4 ++++ 3 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Shared/Components/AbpPageSearchBox/_ViewImports.cshtml diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Shared/Components/AbpPageSearchBox/AbpPageSearchBoxViewComponent.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Shared/Components/AbpPageSearchBox/AbpPageSearchBoxViewComponent.cs index d14c92c62e..a21a3c51cd 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Shared/Components/AbpPageSearchBox/AbpPageSearchBoxViewComponent.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Shared/Components/AbpPageSearchBox/AbpPageSearchBoxViewComponent.cs @@ -1,5 +1,4 @@ -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc; namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Pages.Shared.Components.AbpPageSearchBox { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Shared/Components/AbpPageSearchBox/Default.cshtml b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Shared/Components/AbpPageSearchBox/Default.cshtml index d7a2e893d4..65853b9d73 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Shared/Components/AbpPageSearchBox/Default.cshtml +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Shared/Components/AbpPageSearchBox/Default.cshtml @@ -1,13 +1,17 @@ @using Localization.Resources.AbpUi @using Microsoft.Extensions.Localization + @inject IStringLocalizer L +
- +
- +
-
\ No newline at end of file + + + diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Shared/Components/AbpPageSearchBox/_ViewImports.cshtml b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Shared/Components/AbpPageSearchBox/_ViewImports.cshtml new file mode 100644 index 0000000000..c1da1f5f10 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Pages/Shared/Components/AbpPageSearchBox/_ViewImports.cshtml @@ -0,0 +1,4 @@ +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI +@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap +@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bundling \ No newline at end of file From 09e115422279fd01b92331bda78de6b3c434df1d Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 23 Jun 2020 19:21:46 +0300 Subject: [PATCH 047/190] feat: add ngcc.config.js to module --- .../module/angular/projects/my-project-name/ngcc.config.js | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 templates/module/angular/projects/my-project-name/ngcc.config.js diff --git a/templates/module/angular/projects/my-project-name/ngcc.config.js b/templates/module/angular/projects/my-project-name/ngcc.config.js new file mode 100644 index 0000000000..c34df8ab72 --- /dev/null +++ b/templates/module/angular/projects/my-project-name/ngcc.config.js @@ -0,0 +1,7 @@ +module.exports = { + entryPoints: { + ".": {}, + "./config": {}, + "./dist": { ignore: true }, + }, +}; From da545f3d8d793e3c9cf0f9a99f4396bf21fa312a Mon Sep 17 00:00:00 2001 From: Galip Tolga Erdem Date: Tue, 23 Jun 2020 19:28:47 +0300 Subject: [PATCH 048/190] Added LoggedOut view --- .../Account/Localization/Resources/en.json | 5 ++- .../Account/Localization/Resources/tr.json | 7 ++-- .../IdentityServerSupportedLogoutModel.cs | 21 +++++++++--- .../Pages/Account/LoggedOut.cshtml | 31 ++++++++++++++++++ .../Pages/Account/LoggedOut.cshtml.cs | 32 +++++++++++++++++++ .../Pages/Account/LoggedOut.css | 5 +++ .../Pages/Account/LoggedOut.js | 6 ++++ 7 files changed, 99 insertions(+), 8 deletions(-) create mode 100644 modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml create mode 100644 modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml.cs create mode 100644 modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.css create mode 100644 modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.js diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en.json index 7cf2cf7be6..f0dbdaadb6 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en.json @@ -40,6 +40,9 @@ "DisplayName:Abp.Account.IsSelfRegistrationEnabled": "Is self-registration enabled", "Description:Abp.Account.IsSelfRegistrationEnabled": "Whether a user can register the account by him or herself.", "DisplayName:Abp.Account.EnableLocalLogin": "Authenticate with a local account", - "Description:Abp.Account.EnableLocalLogin": "Indicates if the server will allow users to authenticate with a local account." + "Description:Abp.Account.EnableLocalLogin": "Indicates if the server will allow users to authenticate with a local account.", + "LoggedOutTitle": "Signed Out", + "LoggedOutText": "You have been signed out and you will be redirected soon.", + "ReturnToText": "Click here to redirect to {0}" } } diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json index 60d5f40634..3938a34984 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json @@ -40,6 +40,9 @@ "DisplayName:Abp.Account.IsSelfRegistrationEnabled": "self-registration etkin mi ?", "Description:Abp.Account.IsSelfRegistrationEnabled": "Bir kullanıcının hesabı kendisi tarafından kaydedip kaydedememesidir.", "DisplayName:Abp.Account.EnableLocalLogin": "Yerel bir hesapla kimlik doğrulaması", - "Description:Abp.Account.EnableLocalLogin": "Sunucunun, kullanıcıların yerel bir hesapla kimlik doğrulamasına izin verip vermeyeceğini belirtir." + "Description:Abp.Account.EnableLocalLogin": "Sunucunun, kullanıcıların yerel bir hesapla kimlik doğrulamasına izin verip vermeyeceğini belirtir.", + "LoggedOutTitle": "Çıkış Yaptınız", + "LoggedOutText": "Çıkış yaptınız ve birazdan yönlendirileceksiniz.", + "ReturnToText": "{0} uygulamasına dönmek için tıklayın." } -} \ No newline at end of file +} diff --git a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/IdentityServerSupportedLogoutModel.cs b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/IdentityServerSupportedLogoutModel.cs index ab403ea5a1..43857cc111 100644 --- a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/IdentityServerSupportedLogoutModel.cs +++ b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/IdentityServerSupportedLogoutModel.cs @@ -1,6 +1,8 @@ -using IdentityServer4.Services; +using System.Security.Claims; +using IdentityServer4.Services; using Microsoft.AspNetCore.Mvc; using System.Threading.Tasks; +using Microsoft.Extensions.Logging; using Volo.Abp.DependencyInjection; namespace Volo.Abp.Account.Web.Pages.Account @@ -24,13 +26,20 @@ namespace Volo.Abp.Account.Web.Pages.Account if (!string.IsNullOrEmpty(logoutId)) { var logoutContext = await Interaction.GetLogoutContextAsync(logoutId); + await SignInManager.SignOutAsync(); - var postLogoutUri = logoutContext.PostLogoutRedirectUri; + HttpContext.User = new ClaimsPrincipal(new ClaimsIdentity()); - if (!string.IsNullOrEmpty(postLogoutUri)) + LoggedOutModel vm = new LoggedOutModel() { - return Redirect(postLogoutUri); - } + PostLogoutRedirectUri = logoutContext?.PostLogoutRedirectUri, + ClientName = logoutContext?.ClientName, + SignOutIframeUrl = logoutContext?.SignOutIFrameUrl + }; + + Logger.LogInformation($"Redirecting to LoggedOut Page..."); + + return RedirectToPage("./LoggedOut", vm); } if (ReturnUrl != null) @@ -38,6 +47,8 @@ namespace Volo.Abp.Account.Web.Pages.Account return LocalRedirect(ReturnUrl); } + Logger.LogInformation( + $"IdentityServerSupportedLogoutModel couldn't find postLogoutUri... Redirecting to:/Account/Login.."); return RedirectToPage("/Account/Login"); } } diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml new file mode 100644 index 0000000000..3e3e9857a1 --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml @@ -0,0 +1,31 @@ +@page "/Account/LoggedOut" +@model Volo.Abp.Account.Web.Pages.Account.LoggedOutModel +@using Volo.Abp.Account.Localization +@using Microsoft.AspNetCore.Mvc.Localization +@using Volo.Abp.Account.Web.Pages.Account +@inject IHtmlLocalizer L + +@section scripts { + + + +} + +@section styles { + +} + + + + @L["LoggedOutTitle"] + @L["LoggedOutText"] + @if (Model.PostLogoutRedirectUri != null) + { +
@L["ReturnToText", Model.ClientName] + } + @if (Model.SignOutIframeUrl != null) + { + + } + + diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml.cs b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml.cs new file mode 100644 index 0000000000..26ff28affc --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml.cs @@ -0,0 +1,32 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; + +namespace Volo.Abp.Account.Web.Pages.Account +{ + public class LoggedOutModel : AccountPageModel + { + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ClientName { get; set; } + + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string SignOutIframeUrl { get; set; } + + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string PostLogoutRedirectUri { get; set; } + + public virtual Task OnGetAsync() + { + return Task.FromResult(Page()); + } + + public virtual Task OnPostAsync() + { + return Task.FromResult(Page()); + } + } +} diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.css b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.css new file mode 100644 index 0000000000..75dcda385e --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.css @@ -0,0 +1,5 @@ +.logoutiframe { + display: none; + width:0; + height: 0; +} diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.js b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.js new file mode 100644 index 0000000000..6341b27ea7 --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.js @@ -0,0 +1,6 @@ +(function ($) { + //TODO:gterdem There should be an option to set the redirect delay here + setTimeout(function () { + window.location = $('.redirectButton').attr('href'); + }, 3000) +})(JQuery) From 8bd4d80ea1f37b38b6ce4831ada6938216b6c354 Mon Sep 17 00:00:00 2001 From: Galip Tolga Erdem Date: Tue, 23 Jun 2020 19:29:48 +0300 Subject: [PATCH 049/190] Update LoggedOut.cshtml.cs removed unused usings --- .../Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml.cs b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml.cs index 26ff28affc..6023732975 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml.cs +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml.cs @@ -1,7 +1,5 @@ -using System; -using System.Threading.Tasks; +using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Logging; namespace Volo.Abp.Account.Web.Pages.Account { From 6a2a7679f40444b0d83741ae29580f34d8212398 Mon Sep 17 00:00:00 2001 From: Ismail Yilmaz Date: Tue, 23 Jun 2020 20:49:47 +0300 Subject: [PATCH 050/190] MongoDbRepository.AddGlobalFilters extracted to a service --- .../MongoDB/IMongoDbRepositoryFilterer.cs | 18 +++++ .../Repositories/MongoDB/MongoDbRepository.cs | 49 +----------- .../MongoDB/MongoDbRepositoryFilterer.cs | 79 +++++++++++++++++++ .../Volo/Abp/MongoDB/AbpMongoDbModule.cs | 11 +++ 4 files changed, 112 insertions(+), 45 deletions(-) create mode 100644 framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepositoryFilterer.cs create mode 100644 framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepositoryFilterer.cs diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepositoryFilterer.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepositoryFilterer.cs new file mode 100644 index 0000000000..1790c8af6b --- /dev/null +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepositoryFilterer.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using MongoDB.Driver; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.Domain.Repositories.MongoDB +{ + public interface IMongoDbRepositoryFilterer where TEntity : class, IEntity + { + void AddGlobalFilters(List> filters); + } + + public interface IMongoDbRepositoryFilterer : IMongoDbRepositoryFilterer where TEntity : class, IEntity + { + FilterDefinition CreateEntityFilter(TKey id, bool applyFilters = false); + + FilterDefinition CreateEntityFilter(TEntity entity, bool withConcurrencyStamp = false, string concurrencyStamp = null); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs index 3ac6ab5239..e8477f20e9 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs @@ -14,7 +14,6 @@ using Volo.Abp.EventBus.Distributed; using Volo.Abp.EventBus.Local; using Volo.Abp.Guids; using Volo.Abp.MongoDB; -using Volo.Abp.MultiTenancy; namespace Volo.Abp.Domain.Repositories.MongoDB { @@ -331,6 +330,8 @@ namespace Volo.Abp.Domain.Repositories.MongoDB where TMongoDbContext : IAbpMongoDbContext where TEntity : class, IEntity { + public IMongoDbRepositoryFilterer RepositoryFilterer { get; set; } + public MongoDbRepository(IMongoDbContextProvider dbContextProvider) : base(dbContextProvider) { @@ -358,7 +359,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB CancellationToken cancellationToken = default) { return await Collection - .Find(CreateEntityFilter(id, true)) + .Find(RepositoryFilterer.CreateEntityFilter(id, true)) .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); } @@ -372,49 +373,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB protected override FilterDefinition CreateEntityFilter(TEntity entity, bool withConcurrencyStamp = false, string concurrencyStamp = null) { - if (!withConcurrencyStamp || !(entity is IHasConcurrencyStamp entityWithConcurrencyStamp)) - { - return Builders.Filter.Eq(e => e.Id, entity.Id); - } - - if (concurrencyStamp == null) - { - concurrencyStamp = entityWithConcurrencyStamp.ConcurrencyStamp; - } - - return Builders.Filter.And( - Builders.Filter.Eq(e => e.Id, entity.Id), - Builders.Filter.Eq(e => ((IHasConcurrencyStamp)e).ConcurrencyStamp, concurrencyStamp) - ); - } - - protected virtual FilterDefinition CreateEntityFilter(TKey id, bool applyFilters = false) - { - var filters = new List> - { - Builders.Filter.Eq(e => e.Id, id) - }; - - if (applyFilters) - { - AddGlobalFilters(filters); - } - - return Builders.Filter.And(filters); - } - - protected virtual void AddGlobalFilters(List> filters) - { - if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)) && DataFilter.IsEnabled()) - { - filters.Add(Builders.Filter.Eq(e => ((ISoftDelete)e).IsDeleted, false)); - } - - if (typeof(IMultiTenant).IsAssignableFrom(typeof(TEntity))) - { - var tenantId = CurrentTenant.Id; - filters.Add(Builders.Filter.Eq(e => ((IMultiTenant)e).TenantId, tenantId)); - } + return RepositoryFilterer.CreateEntityFilter(entity, withConcurrencyStamp, concurrencyStamp); } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepositoryFilterer.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepositoryFilterer.cs new file mode 100644 index 0000000000..e75b86aca5 --- /dev/null +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepositoryFilterer.cs @@ -0,0 +1,79 @@ +using System.Collections.Generic; +using MongoDB.Driver; +using Volo.Abp.Data; +using Volo.Abp.Domain.Entities; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.Domain.Repositories.MongoDB +{ + public class MongoDbRepositoryFilterer : IMongoDbRepositoryFilterer + where TEntity : class, IEntity + { + protected IDataFilter DataFilter { get; } + + protected ICurrentTenant CurrentTenant { get; } + + public MongoDbRepositoryFilterer(IDataFilter dataFilter, ICurrentTenant currentTenant) + { + DataFilter = dataFilter; + CurrentTenant = currentTenant; + } + + public void AddGlobalFilters(List> filters) + { + if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)) && DataFilter.IsEnabled()) + { + filters.Add(Builders.Filter.Eq(e => ((ISoftDelete) e).IsDeleted, false)); + } + + if (typeof(IMultiTenant).IsAssignableFrom(typeof(TEntity))) + { + var tenantId = CurrentTenant.Id; + filters.Add(Builders.Filter.Eq(e => ((IMultiTenant) e).TenantId, tenantId)); + } + } + } + + public class MongoDbRepositoryFilterer : MongoDbRepositoryFilterer, + IMongoDbRepositoryFilterer + where TEntity : class, IEntity + { + public MongoDbRepositoryFilterer(IDataFilter dataFilter, ICurrentTenant currentTenant) + : base(dataFilter, currentTenant) + { + } + + public FilterDefinition CreateEntityFilter(TKey id, bool applyFilters = false) + { + var filters = new List> + { + Builders.Filter.Eq(e => e.Id, id) + }; + + if (applyFilters) + { + AddGlobalFilters(filters); + } + + return Builders.Filter.And(filters); + } + + public FilterDefinition CreateEntityFilter(TEntity entity, bool withConcurrencyStamp = false, string concurrencyStamp = null) + { + if (!withConcurrencyStamp || !(entity is IHasConcurrencyStamp entityWithConcurrencyStamp)) + { + return Builders.Filter.Eq(e => e.Id, entity.Id); + } + + if (concurrencyStamp == null) + { + concurrencyStamp = entityWithConcurrencyStamp.ConcurrencyStamp; + } + + return Builders.Filter.And( + Builders.Filter.Eq(e => e.Id, entity.Id), + Builders.Filter.Eq(e => ((IHasConcurrencyStamp) e).ConcurrencyStamp, concurrencyStamp) + ); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/AbpMongoDbModule.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/AbpMongoDbModule.cs index d3e8055a22..e36e972954 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/AbpMongoDbModule.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/AbpMongoDbModule.cs @@ -1,5 +1,6 @@ using Microsoft.Extensions.DependencyInjection.Extensions; using Volo.Abp.Domain; +using Volo.Abp.Domain.Repositories.MongoDB; using Volo.Abp.Modularity; using Volo.Abp.Uow.MongoDB; @@ -14,6 +15,16 @@ namespace Volo.Abp.MongoDB typeof(IMongoDbContextProvider<>), typeof(UnitOfWorkMongoDbContextProvider<>) ); + + context.Services.TryAddTransient( + typeof(IMongoDbRepositoryFilterer<>), + typeof(MongoDbRepositoryFilterer<>) + ); + + context.Services.TryAddTransient( + typeof(IMongoDbRepositoryFilterer<,>), + typeof(MongoDbRepositoryFilterer<,>) + ); } } } From 69aa9b2f035f6a3108b1cf6cfa774c2c1c62df0c Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Wed, 24 Jun 2020 09:51:10 +0800 Subject: [PATCH 051/190] Set ConcurrencyStamp property max length to constant (40) Resolve #4361 --- .../Volo/Abp/Domain/Entities/ConcurrencyStampConsts.cs | 7 +++++++ .../Modeling/AbpEntityTypeBuilderExtensions.cs | 2 +- .../Volo/Abp/Identity/IdentityClaimTypeConsts.cs | 1 - .../Volo/Abp/Identity/IdentityRoleConsts.cs | 1 - .../Volo/Abp/Identity/IdentityUserConsts.cs | 2 -- .../IdentityDbContextModelBuilderExtensions.cs | 6 ------ 6 files changed, 8 insertions(+), 11 deletions(-) create mode 100644 framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/ConcurrencyStampConsts.cs diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/ConcurrencyStampConsts.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/ConcurrencyStampConsts.cs new file mode 100644 index 0000000000..ac655a395d --- /dev/null +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/ConcurrencyStampConsts.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.Domain.Entities +{ + public static class ConcurrencyStampConsts + { + public const int MaxLength = 40; + } +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/Modeling/AbpEntityTypeBuilderExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/Modeling/AbpEntityTypeBuilderExtensions.cs index 0a84b6871d..44962eca4c 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/Modeling/AbpEntityTypeBuilderExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/Modeling/AbpEntityTypeBuilderExtensions.cs @@ -40,9 +40,9 @@ namespace Volo.Abp.EntityFrameworkCore.Modeling { if (b.Metadata.ClrType.IsAssignableTo()) { - //TODO: Max length? b.Property(nameof(IHasConcurrencyStamp.ConcurrencyStamp)) .IsConcurrencyToken() + .HasMaxLength(ConcurrencyStampConsts.MaxLength) .HasColumnName(nameof(IHasConcurrencyStamp.ConcurrencyStamp)); } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityClaimTypeConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityClaimTypeConsts.cs index 32e3197e12..d3ceb03812 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityClaimTypeConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityClaimTypeConsts.cs @@ -6,6 +6,5 @@ public const int MaxRegexLength = 512; public const int MaxRegexDescriptionLength = 128; public const int MaxDescriptionLength = 256; - public const int MaxConcurrencyStampLength = 256; } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityRoleConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityRoleConsts.cs index cac33aa53d..11bde27f34 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityRoleConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityRoleConsts.cs @@ -4,6 +4,5 @@ { public const int MaxNameLength = 256; public const int MaxNormalizedNameLength = MaxNameLength; - public const int MaxConcurrencyStampLength = 256; } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserConsts.cs index ef2cc57ef4..921a409272 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserConsts.cs @@ -23,7 +23,5 @@ namespace Volo.Abp.Identity public const int MaxPasswordHashLength = 256; public const int MaxSecurityStampLength = 256; - - public const int MaxConcurrencyStampLength = 256; } } diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs index 74cc2ce995..000a2a8f00 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs @@ -126,9 +126,6 @@ namespace Volo.Abp.Identity.EntityFrameworkCore b.Property(r => r.Name).IsRequired().HasMaxLength(IdentityRoleConsts.MaxNameLength); b.Property(r => r.NormalizedName).IsRequired().HasMaxLength(IdentityRoleConsts.MaxNormalizedNameLength); - b.Property(u => u.ConcurrencyStamp).IsRequired().IsConcurrencyToken() - .HasMaxLength(IdentityRoleConsts.MaxConcurrencyStampLength) - .HasColumnName(nameof(IdentityRole.ConcurrencyStamp)); b.Property(r => r.IsDefault).HasColumnName(nameof(IdentityRole.IsDefault)); b.Property(r => r.IsStatic).HasColumnName(nameof(IdentityRole.IsStatic)); b.Property(r => r.IsPublic).HasColumnName(nameof(IdentityRole.IsPublic)); @@ -163,9 +160,6 @@ namespace Volo.Abp.Identity.EntityFrameworkCore b.Property(uc => uc.Regex).HasMaxLength(IdentityClaimTypeConsts.MaxRegexLength); b.Property(uc => uc.RegexDescription).HasMaxLength(IdentityClaimTypeConsts.MaxRegexDescriptionLength); b.Property(uc => uc.Description).HasMaxLength(IdentityClaimTypeConsts.MaxDescriptionLength); - b.Property(uc => uc.ConcurrencyStamp).IsRequired().IsConcurrencyToken() - .HasMaxLength(IdentityClaimTypeConsts.MaxConcurrencyStampLength) - .HasColumnName(nameof(IdentityClaimType.ConcurrencyStamp)); }); builder.Entity(b => From c42533bf9f8c14305622d4002cff856514816077 Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Wed, 24 Jun 2020 10:41:41 +0800 Subject: [PATCH 052/190] Update migration files. --- ...4105416_BackgroundJobs_Initial.Designer.cs | 66 - .../20181211140407_AggragateRoot_Changes.cs | 31 - ...023633_BackgroundJobs_Initial.Designer.cs} | 35 +- ... 20200624023633_BackgroundJobs_Initial.cs} | 2 + .../DemoAppDbContextModelSnapshot.cs | 31 +- .../20200531134550_Initial.Designer.cs | 97 - .../Migrations/20200531143839_FK_Added.cs | 34 - ....cs => 20200624023744_Initial.Designer.cs} | 12 +- ...0_Initial.cs => 20200624023744_Initial.cs} | 19 +- .../BlobStoringHostDbContextModelSnapshot.cs | 8 +- ....cs => 20200624023838_Initial.Designer.cs} | 24 +- ...3_Initial.cs => 20200624023838_Initial.cs} | 12 +- .../VoloDocsDbContextModelSnapshot.cs | 22 +- ...3_SetConcurrencyStampMaxLength.Designer.cs | 1892 +++++++++++++++++ ...0624024013_SetConcurrencyStampMaxLength.cs | 213 ++ .../AuthServerDbContextModelSnapshot.cs | 41 +- ....cs => 20200624024055_Initial.Designer.cs} | 37 +- ...3_Initial.cs => 20200624024055_Initial.cs} | 2 +- ...tServiceMigrationDbContextModelSnapshot.cs | 35 +- ....cs => 20200624023152_Initial.Designer.cs} | 46 +- ...9_Initial.cs => 20200624023152_Initial.cs} | 24 +- ...ectNameMigrationsDbContextModelSnapshot.cs | 44 +- ....cs => 20200624023331_Initial.Designer.cs} | 43 +- ...5_Initial.cs => 20200624023331_Initial.cs} | 22 +- ...verHostMigrationsDbContextModelSnapshot.cs | 41 +- ....cs => 20200624023340_Initial.Designer.cs} | 28 +- ...4_Initial.cs => 20200624023340_Initial.cs} | 12 +- .../UnifiedDbContextModelSnapshot.cs | 26 +- 28 files changed, 2456 insertions(+), 443 deletions(-) delete mode 100644 modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20180724105416_BackgroundJobs_Initial.Designer.cs delete mode 100644 modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20181211140407_AggragateRoot_Changes.cs rename modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/{20181211140407_AggragateRoot_Changes.Designer.cs => 20200624023633_BackgroundJobs_Initial.Designer.cs} (59%) rename modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/{20180724105416_BackgroundJobs_Initial.cs => 20200624023633_BackgroundJobs_Initial.cs} (91%) delete mode 100644 modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/20200531134550_Initial.Designer.cs delete mode 100644 modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/20200531143839_FK_Added.cs rename modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/{20200531143839_FK_Added.Designer.cs => 20200624023744_Initial.Designer.cs} (92%) rename modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/{20200531134550_Initial.cs => 20200624023744_Initial.cs} (76%) rename modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/{20200617102723_Initial.Designer.cs => 20200624023838_Initial.Designer.cs} (98%) rename modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/{20200617102723_Initial.cs => 20200624023838_Initial.cs} (98%) create mode 100644 samples/MicroserviceDemo/applications/AuthServer.Host/Migrations/20200624024013_SetConcurrencyStampMaxLength.Designer.cs create mode 100644 samples/MicroserviceDemo/applications/AuthServer.Host/Migrations/20200624024013_SetConcurrencyStampMaxLength.cs rename samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/{20190408114353_Initial.Designer.cs => 20200624024055_Initial.Designer.cs} (57%) rename samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/{20190408114353_Initial.cs => 20200624024055_Initial.cs} (95%) rename templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/{20200525051739_Initial.Designer.cs => 20200624023152_Initial.Designer.cs} (98%) rename templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/{20200525051739_Initial.cs => 20200624023152_Initial.cs} (98%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/{20200525052535_Initial.Designer.cs => 20200624023331_Initial.Designer.cs} (98%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/{20200525052535_Initial.cs => 20200624023331_Initial.cs} (98%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/{20200525052704_Initial.Designer.cs => 20200624023340_Initial.Designer.cs} (97%) rename templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/{20200525052704_Initial.cs => 20200624023340_Initial.cs} (98%) diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20180724105416_BackgroundJobs_Initial.Designer.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20180724105416_BackgroundJobs_Initial.Designer.cs deleted file mode 100644 index acab1e91e7..0000000000 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20180724105416_BackgroundJobs_Initial.Designer.cs +++ /dev/null @@ -1,66 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Volo.Abp.BackgroundJobs; -using Volo.Abp.BackgroundJobs.DemoApp.Db; - -namespace Volo.Abp.BackgroundJobs.DemoApp.Migrations -{ - [DbContext(typeof(DemoAppDbContext))] - [Migration("20180724105416_BackgroundJobs_Initial")] - partial class BackgroundJobs_Initial - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "2.1.0-rtm-30799") - .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("CreationTime") - .HasColumnName("CreationTime"); - - b.Property("IsAbandoned") - .ValueGeneratedOnAdd() - .HasDefaultValue(false); - - b.Property("JobArgs") - .IsRequired() - .HasMaxLength(1048576); - - b.Property("JobName") - .IsRequired() - .HasMaxLength(128); - - b.Property("LastTryTime"); - - b.Property("NextTryTime"); - - b.Property("Priority") - .ValueGeneratedOnAdd() - .HasDefaultValue((byte)15); - - b.Property("TryCount") - .ValueGeneratedOnAdd() - .HasDefaultValue((short)0); - - b.HasKey("Id"); - - b.HasIndex("IsAbandoned", "NextTryTime"); - - b.ToTable("AbpBackgroundJobs"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20181211140407_AggragateRoot_Changes.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20181211140407_AggragateRoot_Changes.cs deleted file mode 100644 index 25aa036ed3..0000000000 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20181211140407_AggragateRoot_Changes.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -namespace Volo.Abp.BackgroundJobs.DemoApp.Migrations -{ - public partial class AggragateRoot_Changes : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "ConcurrencyStamp", - table: "AbpBackgroundJobs", - nullable: true); - - migrationBuilder.AddColumn( - name: "ExtraProperties", - table: "AbpBackgroundJobs", - nullable: true); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "ConcurrencyStamp", - table: "AbpBackgroundJobs"); - - migrationBuilder.DropColumn( - name: "ExtraProperties", - table: "AbpBackgroundJobs"); - } - } -} diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20181211140407_AggragateRoot_Changes.Designer.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20200624023633_BackgroundJobs_Initial.Designer.cs similarity index 59% rename from modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20181211140407_AggragateRoot_Changes.Designer.cs rename to modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20200624023633_BackgroundJobs_Initial.Designer.cs index d4ed20351c..40c0adcee7 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20181211140407_AggragateRoot_Changes.Designer.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20200624023633_BackgroundJobs_Initial.Designer.cs @@ -5,58 +5,73 @@ using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Volo.Abp.BackgroundJobs; using Volo.Abp.BackgroundJobs.DemoApp.Db; +using Volo.Abp.EntityFrameworkCore; namespace Volo.Abp.BackgroundJobs.DemoApp.Migrations { [DbContext(typeof(DemoAppDbContext))] - [Migration("20181211140407_AggragateRoot_Changes")] - partial class AggragateRoot_Changes + [Migration("20200624023633_BackgroundJobs_Initial")] + partial class BackgroundJobs_Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "2.1.0-rtm-30799") + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "3.1.5") .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b => { b.Property("Id") - .ValueGeneratedOnAdd(); + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); - b.Property("ConcurrencyStamp"); + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp") + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") - .HasColumnName("CreationTime"); + .HasColumnName("CreationTime") + .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties"); + .HasColumnName("ExtraProperties") + .HasColumnType("nvarchar(max)"); b.Property("IsAbandoned") .ValueGeneratedOnAdd() + .HasColumnType("bit") .HasDefaultValue(false); b.Property("JobArgs") .IsRequired() + .HasColumnType("nvarchar(max)") .HasMaxLength(1048576); b.Property("JobName") .IsRequired() + .HasColumnType("nvarchar(128)") .HasMaxLength(128); - b.Property("LastTryTime"); + b.Property("LastTryTime") + .HasColumnType("datetime2"); - b.Property("NextTryTime"); + b.Property("NextTryTime") + .HasColumnType("datetime2"); b.Property("Priority") .ValueGeneratedOnAdd() + .HasColumnType("tinyint") .HasDefaultValue((byte)15); b.Property("TryCount") .ValueGeneratedOnAdd() + .HasColumnType("smallint") .HasDefaultValue((short)0); b.HasKey("Id"); diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20180724105416_BackgroundJobs_Initial.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20200624023633_BackgroundJobs_Initial.cs similarity index 91% rename from modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20180724105416_BackgroundJobs_Initial.cs rename to modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20200624023633_BackgroundJobs_Initial.cs index 76202a0748..eebffa859a 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20180724105416_BackgroundJobs_Initial.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20200624023633_BackgroundJobs_Initial.cs @@ -12,6 +12,8 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Migrations columns: table => new { Id = table.Column(nullable: false), + ExtraProperties = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), JobName = table.Column(maxLength: 128, nullable: false), JobArgs = table.Column(maxLength: 1048576, nullable: false), TryCount = table.Column(nullable: false, defaultValue: (short)0), diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/DemoAppDbContextModelSnapshot.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/DemoAppDbContextModelSnapshot.cs index d58d7a4966..fa77fd75ca 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/DemoAppDbContextModelSnapshot.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/DemoAppDbContextModelSnapshot.cs @@ -4,8 +4,8 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Volo.Abp.BackgroundJobs; using Volo.Abp.BackgroundJobs.DemoApp.Db; +using Volo.Abp.EntityFrameworkCore; namespace Volo.Abp.BackgroundJobs.DemoApp.Migrations { @@ -16,45 +16,60 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "2.1.0-rtm-30799") + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "3.1.5") .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b => { b.Property("Id") - .ValueGeneratedOnAdd(); + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); - b.Property("ConcurrencyStamp"); + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp") + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") - .HasColumnName("CreationTime"); + .HasColumnName("CreationTime") + .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties"); + .HasColumnName("ExtraProperties") + .HasColumnType("nvarchar(max)"); b.Property("IsAbandoned") .ValueGeneratedOnAdd() + .HasColumnType("bit") .HasDefaultValue(false); b.Property("JobArgs") .IsRequired() + .HasColumnType("nvarchar(max)") .HasMaxLength(1048576); b.Property("JobName") .IsRequired() + .HasColumnType("nvarchar(128)") .HasMaxLength(128); - b.Property("LastTryTime"); + b.Property("LastTryTime") + .HasColumnType("datetime2"); - b.Property("NextTryTime"); + b.Property("NextTryTime") + .HasColumnType("datetime2"); b.Property("Priority") .ValueGeneratedOnAdd() + .HasColumnType("tinyint") .HasDefaultValue((byte)15); b.Property("TryCount") .ValueGeneratedOnAdd() + .HasColumnType("smallint") .HasDefaultValue((short)0); b.HasKey("Id"); diff --git a/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/20200531134550_Initial.Designer.cs b/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/20200531134550_Initial.Designer.cs deleted file mode 100644 index 23fe326a47..0000000000 --- a/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/20200531134550_Initial.Designer.cs +++ /dev/null @@ -1,97 +0,0 @@ -// -using System; -using BlobStoring.Database.Host.ConsoleApp.ConsoleApp.EfCore; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Volo.Abp.EntityFrameworkCore; - -namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.Migrations -{ - [DbContext(typeof(BlobStoringHostDbContext))] - [Migration("20200531134550_Initial")] - partial class Initial - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "3.1.4") - .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlob", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); - - b.Property("ContainerId") - .HasColumnType("uniqueidentifier"); - - b.Property("Content") - .HasColumnType("varbinary(max)") - .HasMaxLength(2147483647); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("TenantId", "ContainerId", "Name"); - - b.ToTable("AbpBlobs"); - }); - - modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("TenantId", "Name"); - - b.ToTable("AbpBlobContainers"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/20200531143839_FK_Added.cs b/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/20200531143839_FK_Added.cs deleted file mode 100644 index 4411063f94..0000000000 --- a/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/20200531143839_FK_Added.cs +++ /dev/null @@ -1,34 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.Migrations -{ - public partial class FK_Added : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateIndex( - name: "IX_AbpBlobs_ContainerId", - table: "AbpBlobs", - column: "ContainerId"); - - migrationBuilder.AddForeignKey( - name: "FK_AbpBlobs_AbpBlobContainers_ContainerId", - table: "AbpBlobs", - column: "ContainerId", - principalTable: "AbpBlobContainers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_AbpBlobs_AbpBlobContainers_ContainerId", - table: "AbpBlobs"); - - migrationBuilder.DropIndex( - name: "IX_AbpBlobs_ContainerId", - table: "AbpBlobs"); - } - } -} diff --git a/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/20200531143839_FK_Added.Designer.cs b/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/20200624023744_Initial.Designer.cs similarity index 92% rename from modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/20200531143839_FK_Added.Designer.cs rename to modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/20200624023744_Initial.Designer.cs index 1214d7f500..5aa34b1eda 100644 --- a/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/20200531143839_FK_Added.Designer.cs +++ b/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/20200624023744_Initial.Designer.cs @@ -11,15 +11,15 @@ using Volo.Abp.EntityFrameworkCore; namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.Migrations { [DbContext(typeof(BlobStoringHostDbContext))] - [Migration("20200531143839_FK_Added")] - partial class FK_Added + [Migration("20200624023744_Initial")] + partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "3.1.4") + .HasAnnotation("ProductVersion", "3.1.5") .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); @@ -32,7 +32,8 @@ namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("ContainerId") .HasColumnType("uniqueidentifier"); @@ -72,7 +73,8 @@ namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("ExtraProperties") .HasColumnName("ExtraProperties") diff --git a/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/20200531134550_Initial.cs b/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/20200624023744_Initial.cs similarity index 76% rename from modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/20200531134550_Initial.cs rename to modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/20200624023744_Initial.cs index d1ee75ac7f..bc8d412cb5 100644 --- a/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/20200531134550_Initial.cs +++ b/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/20200624023744_Initial.cs @@ -13,7 +13,7 @@ namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), TenantId = table.Column(nullable: true), Name = table.Column(maxLength: 128, nullable: false) }, @@ -28,7 +28,7 @@ namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), ContainerId = table.Column(nullable: false), TenantId = table.Column(nullable: true), Name = table.Column(maxLength: 256, nullable: false), @@ -37,6 +37,12 @@ namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.Migrations constraints: table => { table.PrimaryKey("PK_AbpBlobs", x => x.Id); + table.ForeignKey( + name: "FK_AbpBlobs_AbpBlobContainers_ContainerId", + column: x => x.ContainerId, + principalTable: "AbpBlobContainers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateIndex( @@ -44,6 +50,11 @@ namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.Migrations table: "AbpBlobContainers", columns: new[] { "TenantId", "Name" }); + migrationBuilder.CreateIndex( + name: "IX_AbpBlobs_ContainerId", + table: "AbpBlobs", + column: "ContainerId"); + migrationBuilder.CreateIndex( name: "IX_AbpBlobs_TenantId_ContainerId_Name", table: "AbpBlobs", @@ -53,10 +64,10 @@ namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.Migrations protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropTable( - name: "AbpBlobContainers"); + name: "AbpBlobs"); migrationBuilder.DropTable( - name: "AbpBlobs"); + name: "AbpBlobContainers"); } } } diff --git a/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/BlobStoringHostDbContextModelSnapshot.cs b/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/BlobStoringHostDbContextModelSnapshot.cs index 278eb1f72c..796c68b0ad 100644 --- a/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/BlobStoringHostDbContextModelSnapshot.cs +++ b/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/Migrations/BlobStoringHostDbContextModelSnapshot.cs @@ -17,7 +17,7 @@ namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "3.1.4") + .HasAnnotation("ProductVersion", "3.1.5") .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); @@ -30,7 +30,8 @@ namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("ContainerId") .HasColumnType("uniqueidentifier"); @@ -70,7 +71,8 @@ namespace BlobStoring.Database.Host.ConsoleApp.ConsoleApp.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("ExtraProperties") .HasColumnName("ExtraProperties") diff --git a/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20200617102723_Initial.Designer.cs b/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20200624023838_Initial.Designer.cs similarity index 98% rename from modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20200617102723_Initial.Designer.cs rename to modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20200624023838_Initial.Designer.cs index 5fbced9e4a..2fb2a6782a 100644 --- a/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20200617102723_Initial.Designer.cs +++ b/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20200624023838_Initial.Designer.cs @@ -11,7 +11,7 @@ using VoloDocs.EntityFrameworkCore; namespace VoloDocs.EntityFrameworkCore.Migrations { [DbContext(typeof(VoloDocsDbContext))] - [Migration("20200617102723_Initial")] + [Migration("20200624023838_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -31,10 +31,9 @@ namespace VoloDocs.EntityFrameworkCore.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .IsRequired() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("Description") .HasColumnType("nvarchar(256)") @@ -79,10 +78,9 @@ namespace VoloDocs.EntityFrameworkCore.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .IsRequired() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("ExtraProperties") .HasColumnName("ExtraProperties") @@ -164,7 +162,8 @@ namespace VoloDocs.EntityFrameworkCore.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -437,7 +436,8 @@ namespace VoloDocs.EntityFrameworkCore.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -594,7 +594,8 @@ namespace VoloDocs.EntityFrameworkCore.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("Content") .IsRequired() @@ -692,7 +693,8 @@ namespace VoloDocs.EntityFrameworkCore.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("DefaultDocumentName") .IsRequired() diff --git a/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20200617102723_Initial.cs b/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20200624023838_Initial.cs similarity index 98% rename from modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20200617102723_Initial.cs rename to modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20200624023838_Initial.cs index 179387743c..66b5265a33 100644 --- a/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20200617102723_Initial.cs +++ b/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20200624023838_Initial.cs @@ -13,7 +13,7 @@ namespace VoloDocs.EntityFrameworkCore.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 256, nullable: false), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), Name = table.Column(maxLength: 256, nullable: false), Required = table.Column(nullable: false), IsStatic = table.Column(nullable: false), @@ -33,7 +33,7 @@ namespace VoloDocs.EntityFrameworkCore.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: true), LastModificationTime = table.Column(nullable: true), @@ -78,7 +78,7 @@ namespace VoloDocs.EntityFrameworkCore.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 256, nullable: false), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), TenantId = table.Column(nullable: true), Name = table.Column(maxLength: 256, nullable: false), NormalizedName = table.Column(maxLength: 256, nullable: false), @@ -112,7 +112,7 @@ namespace VoloDocs.EntityFrameworkCore.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: true), LastModificationTime = table.Column(nullable: true), @@ -148,7 +148,7 @@ namespace VoloDocs.EntityFrameworkCore.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), ProjectId = table.Column(nullable: false), Name = table.Column(maxLength: 255, nullable: false), Version = table.Column(maxLength: 128, nullable: false), @@ -176,7 +176,7 @@ namespace VoloDocs.EntityFrameworkCore.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), Name = table.Column(maxLength: 128, nullable: false), ShortName = table.Column(maxLength: 32, nullable: false), Format = table.Column(nullable: true), diff --git a/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/VoloDocsDbContextModelSnapshot.cs b/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/VoloDocsDbContextModelSnapshot.cs index 43feaed625..73b261e454 100644 --- a/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/VoloDocsDbContextModelSnapshot.cs +++ b/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/VoloDocsDbContextModelSnapshot.cs @@ -29,10 +29,9 @@ namespace VoloDocs.EntityFrameworkCore.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .IsRequired() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("Description") .HasColumnType("nvarchar(256)") @@ -77,10 +76,9 @@ namespace VoloDocs.EntityFrameworkCore.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .IsRequired() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("ExtraProperties") .HasColumnName("ExtraProperties") @@ -162,7 +160,8 @@ namespace VoloDocs.EntityFrameworkCore.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -435,7 +434,8 @@ namespace VoloDocs.EntityFrameworkCore.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -592,7 +592,8 @@ namespace VoloDocs.EntityFrameworkCore.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("Content") .IsRequired() @@ -690,7 +691,8 @@ namespace VoloDocs.EntityFrameworkCore.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("DefaultDocumentName") .IsRequired() diff --git a/samples/MicroserviceDemo/applications/AuthServer.Host/Migrations/20200624024013_SetConcurrencyStampMaxLength.Designer.cs b/samples/MicroserviceDemo/applications/AuthServer.Host/Migrations/20200624024013_SetConcurrencyStampMaxLength.Designer.cs new file mode 100644 index 0000000000..8df6844e29 --- /dev/null +++ b/samples/MicroserviceDemo/applications/AuthServer.Host/Migrations/20200624024013_SetConcurrencyStampMaxLength.Designer.cs @@ -0,0 +1,1892 @@ +// +using System; +using AuthServer.Host.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Volo.Abp.EntityFrameworkCore; + +namespace AuthServer.Host.Migrations +{ + [DbContext(typeof(AuthServerDbContext))] + [Migration("20200624024013_SetConcurrencyStampMaxLength")] + partial class SetConcurrencyStampMaxLength + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "3.1.5") + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationName") + .HasColumnName("ApplicationName") + .HasColumnType("nvarchar(96)") + .HasMaxLength(96); + + b.Property("BrowserInfo") + .HasColumnName("BrowserInfo") + .HasColumnType("nvarchar(512)") + .HasMaxLength(512); + + b.Property("ClientId") + .HasColumnName("ClientId") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("ClientIpAddress") + .HasColumnName("ClientIpAddress") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("ClientName") + .HasColumnName("ClientName") + .HasColumnType("nvarchar(128)") + .HasMaxLength(128); + + b.Property("Comments") + .HasColumnName("Comments") + .HasColumnType("nvarchar(256)") + .HasMaxLength(256); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp") + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); + + b.Property("CorrelationId") + .HasColumnName("CorrelationId") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("Exceptions") + .HasColumnName("Exceptions") + .HasColumnType("nvarchar(4000)") + .HasMaxLength(4000); + + b.Property("ExecutionDuration") + .HasColumnName("ExecutionDuration") + .HasColumnType("int"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("HttpMethod") + .HasColumnName("HttpMethod") + .HasColumnType("nvarchar(16)") + .HasMaxLength(16); + + b.Property("HttpStatusCode") + .HasColumnName("HttpStatusCode") + .HasColumnType("int"); + + b.Property("ImpersonatorTenantId") + .HasColumnName("ImpersonatorTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("ImpersonatorUserId") + .HasColumnName("ImpersonatorUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantName") + .HasColumnType("nvarchar(max)"); + + b.Property("Url") + .HasColumnName("Url") + .HasColumnType("nvarchar(256)") + .HasMaxLength(256); + + b.Property("UserId") + .HasColumnName("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserName") + .HasColumnName("UserName") + .HasColumnType("nvarchar(256)") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ExecutionTime"); + + b.HasIndex("TenantId", "UserId", "ExecutionTime"); + + b.ToTable("AbpAuditLogs"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnName("AuditLogId") + .HasColumnType("uniqueidentifier"); + + b.Property("ExecutionDuration") + .HasColumnName("ExecutionDuration") + .HasColumnType("int"); + + b.Property("ExecutionTime") + .HasColumnName("ExecutionTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("MethodName") + .HasColumnName("MethodName") + .HasColumnType("nvarchar(128)") + .HasMaxLength(128); + + b.Property("Parameters") + .HasColumnName("Parameters") + .HasColumnType("nvarchar(2000)") + .HasMaxLength(2000); + + b.Property("ServiceName") + .HasColumnName("ServiceName") + .HasColumnType("nvarchar(256)") + .HasMaxLength(256); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AbpAuditLogActions"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnName("AuditLogId") + .HasColumnType("uniqueidentifier"); + + b.Property("ChangeTime") + .HasColumnName("ChangeTime") + .HasColumnType("datetime2"); + + b.Property("ChangeType") + .HasColumnName("ChangeType") + .HasColumnType("tinyint"); + + b.Property("EntityId") + .IsRequired() + .HasColumnName("EntityId") + .HasColumnType("nvarchar(128)") + .HasMaxLength(128); + + b.Property("EntityTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasColumnName("EntityTypeFullName") + .HasColumnType("nvarchar(128)") + .HasMaxLength(128); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("AbpEntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EntityChangeId") + .HasColumnType("uniqueidentifier"); + + b.Property("NewValue") + .HasColumnName("NewValue") + .HasColumnType("nvarchar(512)") + .HasMaxLength(512); + + b.Property("OriginalValue") + .HasColumnName("OriginalValue") + .HasColumnType("nvarchar(512)") + .HasMaxLength(512); + + b.Property("PropertyName") + .IsRequired() + .HasColumnName("PropertyName") + .HasColumnType("nvarchar(128)") + .HasMaxLength(128); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasColumnName("PropertyTypeFullName") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("AbpEntityPropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(128)") + .HasMaxLength(128); + + b.Property("ProviderKey") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("ProviderName") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("Value") + .IsRequired() + .HasColumnType("nvarchar(128)") + .HasMaxLength(128); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey"); + + b.ToTable("AbpFeatureValues"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp") + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); + + b.Property("Description") + .HasColumnType("nvarchar(256)") + .HasMaxLength(256); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("IsStatic") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(256)") + .HasMaxLength(256); + + b.Property("Regex") + .HasColumnType("nvarchar(512)") + .HasMaxLength(512); + + b.Property("RegexDescription") + .HasColumnType("nvarchar(128)") + .HasMaxLength(128); + + b.Property("Required") + .HasColumnType("bit"); + + b.Property("ValueType") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp") + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDefault") + .HasColumnName("IsDefault") + .HasColumnType("bit"); + + b.Property("IsPublic") + .HasColumnName("IsPublic") + .HasColumnType("bit"); + + b.Property("IsStatic") + .HasColumnName("IsStatic") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(256)") + .HasMaxLength(256); + + b.Property("NormalizedName") + .IsRequired() + .HasColumnType("nvarchar(256)") + .HasMaxLength(256); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasColumnType("nvarchar(256)") + .HasMaxLength(256); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(1024)") + .HasMaxLength(1024); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnName("AccessFailedCount") + .HasColumnType("int") + .HasDefaultValue(0); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp") + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); + + b.Property("CreationTime") + .HasColumnName("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreatorId") + .HasColumnName("CreatorId") + .HasColumnType("uniqueidentifier"); + + b.Property("DeleterId") + .HasColumnName("DeleterId") + .HasColumnType("uniqueidentifier"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime") + .HasColumnType("datetime2"); + + b.Property("Email") + .IsRequired() + .HasColumnName("Email") + .HasColumnType("nvarchar(256)") + .HasMaxLength(256); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnName("EmailConfirmed") + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime") + .HasColumnType("datetime2"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId") + .HasColumnType("uniqueidentifier"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnName("LockoutEnabled") + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("Name") + .HasColumnName("Name") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("NormalizedEmail") + .IsRequired() + .HasColumnName("NormalizedEmail") + .HasColumnType("nvarchar(256)") + .HasMaxLength(256); + + b.Property("NormalizedUserName") + .IsRequired() + .HasColumnName("NormalizedUserName") + .HasColumnType("nvarchar(256)") + .HasMaxLength(256); + + b.Property("PasswordHash") + .HasColumnName("PasswordHash") + .HasColumnType("nvarchar(256)") + .HasMaxLength(256); + + b.Property("PhoneNumber") + .HasColumnName("PhoneNumber") + .HasColumnType("nvarchar(16)") + .HasMaxLength(16); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnName("PhoneNumberConfirmed") + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("SecurityStamp") + .IsRequired() + .HasColumnName("SecurityStamp") + .HasColumnType("nvarchar(256)") + .HasMaxLength(256); + + b.Property("Surname") + .HasColumnName("Surname") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnName("TwoFactorEnabled") + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("UserName") + .IsRequired() + .HasColumnName("UserName") + .HasColumnType("nvarchar(256)") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasColumnType("nvarchar(256)") + .HasMaxLength(256); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(1024)") + .HasMaxLength(1024); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("ProviderDisplayName") + .HasColumnType("nvarchar(128)") + .HasMaxLength(128); + + b.Property("ProviderKey") + .IsRequired() + .HasColumnType("nvarchar(196)") + .HasMaxLength(196); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnName("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreatorId") + .HasColumnName("CreatorId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("AbpUserOrganizationUnits"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("Name") + .HasColumnType("nvarchar(128)") + .HasMaxLength(128); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Code") + .IsRequired() + .HasColumnName("Code") + .HasColumnType("nvarchar(95)") + .HasMaxLength(95); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp") + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); + + b.Property("CreationTime") + .HasColumnName("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreatorId") + .HasColumnName("CreatorId") + .HasColumnType("uniqueidentifier"); + + b.Property("DeleterId") + .HasColumnName("DeleterId") + .HasColumnType("uniqueidentifier"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime") + .HasColumnType("datetime2"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnName("DisplayName") + .HasColumnType("nvarchar(128)") + .HasMaxLength(128); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime") + .HasColumnType("datetime2"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId") + .HasColumnType("uniqueidentifier"); + + b.Property("ParentId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("AbpOrganizationUnits"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnName("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreatorId") + .HasColumnName("CreatorId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("AbpOrganizationUnitRoles"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResource", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp") + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); + + b.Property("CreationTime") + .HasColumnName("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreatorId") + .HasColumnName("CreatorId") + .HasColumnType("uniqueidentifier"); + + b.Property("DeleterId") + .HasColumnName("DeleterId") + .HasColumnType("uniqueidentifier"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasColumnType("nvarchar(1000)") + .HasMaxLength(1000); + + b.Property("DisplayName") + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime") + .HasColumnType("datetime2"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId") + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("IdentityServerApiResources"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => + { + b.Property("ApiResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Type") + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.HasKey("ApiResourceId", "Type"); + + b.ToTable("IdentityServerApiClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScope", b => + { + b.Property("ApiResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.Property("Description") + .HasColumnType("nvarchar(1000)") + .HasMaxLength(1000); + + b.Property("DisplayName") + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.Property("Emphasize") + .HasColumnType("bit"); + + b.Property("Required") + .HasColumnType("bit"); + + b.Property("ShowInDiscoveryDocument") + .HasColumnType("bit"); + + b.HasKey("ApiResourceId", "Name"); + + b.ToTable("IdentityServerApiScopes"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScopeClaim", b => + { + b.Property("ApiResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.Property("Type") + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.HasKey("ApiResourceId", "Name", "Type"); + + b.ToTable("IdentityServerApiScopeClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiSecret", b => + { + b.Property("ApiResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Type") + .HasColumnType("nvarchar(250)") + .HasMaxLength(250); + + b.Property("Value") + .HasColumnType("nvarchar(4000)") + .HasMaxLength(4000); + + b.Property("Description") + .HasColumnType("nvarchar(2000)") + .HasMaxLength(2000); + + b.Property("Expiration") + .HasColumnType("datetime2"); + + b.HasKey("ApiResourceId", "Type", "Value"); + + b.ToTable("IdentityServerApiSecrets"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.Client", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AbsoluteRefreshTokenLifetime") + .HasColumnType("int"); + + b.Property("AccessTokenLifetime") + .HasColumnType("int"); + + b.Property("AccessTokenType") + .HasColumnType("int"); + + b.Property("AllowAccessTokensViaBrowser") + .HasColumnType("bit"); + + b.Property("AllowOfflineAccess") + .HasColumnType("bit"); + + b.Property("AllowPlainTextPkce") + .HasColumnType("bit"); + + b.Property("AllowRememberConsent") + .HasColumnType("bit"); + + b.Property("AlwaysIncludeUserClaimsInIdToken") + .HasColumnType("bit"); + + b.Property("AlwaysSendClientClaims") + .HasColumnType("bit"); + + b.Property("AuthorizationCodeLifetime") + .HasColumnType("int"); + + b.Property("BackChannelLogoutSessionRequired") + .HasColumnType("bit"); + + b.Property("BackChannelLogoutUri") + .HasColumnType("nvarchar(2000)") + .HasMaxLength(2000); + + b.Property("ClientClaimsPrefix") + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.Property("ClientId") + .IsRequired() + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.Property("ClientName") + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.Property("ClientUri") + .HasColumnType("nvarchar(2000)") + .HasMaxLength(2000); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp") + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); + + b.Property("ConsentLifetime") + .HasColumnType("int"); + + b.Property("CreationTime") + .HasColumnName("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreatorId") + .HasColumnName("CreatorId") + .HasColumnType("uniqueidentifier"); + + b.Property("DeleterId") + .HasColumnName("DeleterId") + .HasColumnType("uniqueidentifier"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasColumnType("nvarchar(1000)") + .HasMaxLength(1000); + + b.Property("DeviceCodeLifetime") + .HasColumnType("int"); + + b.Property("EnableLocalLogin") + .HasColumnType("bit"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("FrontChannelLogoutSessionRequired") + .HasColumnType("bit"); + + b.Property("FrontChannelLogoutUri") + .HasColumnType("nvarchar(2000)") + .HasMaxLength(2000); + + b.Property("IdentityTokenLifetime") + .HasColumnType("int"); + + b.Property("IncludeJwtId") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime") + .HasColumnType("datetime2"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId") + .HasColumnType("uniqueidentifier"); + + b.Property("LogoUri") + .HasColumnType("nvarchar(2000)") + .HasMaxLength(2000); + + b.Property("PairWiseSubjectSalt") + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.Property("ProtocolType") + .IsRequired() + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.Property("RefreshTokenExpiration") + .HasColumnType("int"); + + b.Property("RefreshTokenUsage") + .HasColumnType("int"); + + b.Property("RequireClientSecret") + .HasColumnType("bit"); + + b.Property("RequireConsent") + .HasColumnType("bit"); + + b.Property("RequirePkce") + .HasColumnType("bit"); + + b.Property("SlidingRefreshTokenLifetime") + .HasColumnType("int"); + + b.Property("UpdateAccessTokenClaimsOnRefresh") + .HasColumnType("bit"); + + b.Property("UserCodeType") + .HasColumnType("nvarchar(100)") + .HasMaxLength(100); + + b.Property("UserSsoLifetime") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.ToTable("IdentityServerClients"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientClaim", b => + { + b.Property("ClientId") + .HasColumnType("uniqueidentifier"); + + b.Property("Type") + .HasColumnType("nvarchar(250)") + .HasMaxLength(250); + + b.Property("Value") + .HasColumnType("nvarchar(250)") + .HasMaxLength(250); + + b.HasKey("ClientId", "Type", "Value"); + + b.ToTable("IdentityServerClientClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientCorsOrigin", b => + { + b.Property("ClientId") + .HasColumnType("uniqueidentifier"); + + b.Property("Origin") + .HasColumnType("nvarchar(150)") + .HasMaxLength(150); + + b.HasKey("ClientId", "Origin"); + + b.ToTable("IdentityServerClientCorsOrigins"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientGrantType", b => + { + b.Property("ClientId") + .HasColumnType("uniqueidentifier"); + + b.Property("GrantType") + .HasColumnType("nvarchar(250)") + .HasMaxLength(250); + + b.HasKey("ClientId", "GrantType"); + + b.ToTable("IdentityServerClientGrantTypes"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientIdPRestriction", b => + { + b.Property("ClientId") + .HasColumnType("uniqueidentifier"); + + b.Property("Provider") + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.HasKey("ClientId", "Provider"); + + b.ToTable("IdentityServerClientIdPRestrictions"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientPostLogoutRedirectUri", b => + { + b.Property("ClientId") + .HasColumnType("uniqueidentifier"); + + b.Property("PostLogoutRedirectUri") + .HasColumnType("nvarchar(2000)") + .HasMaxLength(2000); + + b.HasKey("ClientId", "PostLogoutRedirectUri"); + + b.ToTable("IdentityServerClientPostLogoutRedirectUris"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientProperty", b => + { + b.Property("ClientId") + .HasColumnType("uniqueidentifier"); + + b.Property("Key") + .HasColumnType("nvarchar(250)") + .HasMaxLength(250); + + b.Property("Value") + .IsRequired() + .HasColumnType("nvarchar(2000)") + .HasMaxLength(2000); + + b.HasKey("ClientId", "Key"); + + b.ToTable("IdentityServerClientProperties"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientRedirectUri", b => + { + b.Property("ClientId") + .HasColumnType("uniqueidentifier"); + + b.Property("RedirectUri") + .HasColumnType("nvarchar(2000)") + .HasMaxLength(2000); + + b.HasKey("ClientId", "RedirectUri"); + + b.ToTable("IdentityServerClientRedirectUris"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientScope", b => + { + b.Property("ClientId") + .HasColumnType("uniqueidentifier"); + + b.Property("Scope") + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.HasKey("ClientId", "Scope"); + + b.ToTable("IdentityServerClientScopes"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientSecret", b => + { + b.Property("ClientId") + .HasColumnType("uniqueidentifier"); + + b.Property("Type") + .HasColumnType("nvarchar(250)") + .HasMaxLength(250); + + b.Property("Value") + .HasColumnType("nvarchar(4000)") + .HasMaxLength(4000); + + b.Property("Description") + .HasColumnType("nvarchar(2000)") + .HasMaxLength(2000); + + b.Property("Expiration") + .HasColumnType("datetime2"); + + b.HasKey("ClientId", "Type", "Value"); + + b.ToTable("IdentityServerClientSecrets"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Devices.DeviceFlowCodes", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ClientId") + .IsRequired() + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp") + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); + + b.Property("CreationTime") + .HasColumnName("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreatorId") + .HasColumnName("CreatorId") + .HasColumnType("uniqueidentifier"); + + b.Property("Data") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasMaxLength(50000); + + b.Property("DeviceCode") + .IsRequired() + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.Property("Expiration") + .IsRequired() + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("SubjectId") + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.Property("UserCode") + .IsRequired() + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.HasKey("Id"); + + b.HasIndex("DeviceCode") + .IsUnique(); + + b.HasIndex("Expiration"); + + b.HasIndex("UserCode") + .IsUnique(); + + b.ToTable("IdentityServerDeviceFlowCodes"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Grants.PersistedGrant", b => + { + b.Property("Key") + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.Property("ClientId") + .IsRequired() + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp") + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("Data") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasMaxLength(50000); + + b.Property("Expiration") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("SubjectId") + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.Property("Type") + .IsRequired() + .HasColumnType("nvarchar(50)") + .HasMaxLength(50); + + b.HasKey("Key"); + + b.HasIndex("Expiration"); + + b.HasIndex("SubjectId", "ClientId", "Type"); + + b.ToTable("IdentityServerPersistedGrants"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityClaim", b => + { + b.Property("IdentityResourceId") + .HasColumnType("uniqueidentifier"); + + b.Property("Type") + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.HasKey("IdentityResourceId", "Type"); + + b.ToTable("IdentityServerIdentityClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp") + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); + + b.Property("CreationTime") + .HasColumnName("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreatorId") + .HasColumnName("CreatorId") + .HasColumnType("uniqueidentifier"); + + b.Property("DeleterId") + .HasColumnName("DeleterId") + .HasColumnType("uniqueidentifier"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasColumnType("nvarchar(1000)") + .HasMaxLength(1000); + + b.Property("DisplayName") + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.Property("Emphasize") + .HasColumnType("bit"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime") + .HasColumnType("datetime2"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId") + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(200)") + .HasMaxLength(200); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("Required") + .HasColumnType("bit"); + + b.Property("ShowInDiscoveryDocument") + .HasColumnType("bit"); + + b.HasKey("Id"); + + b.ToTable("IdentityServerIdentityResources"); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(128)") + .HasMaxLength(128); + + b.Property("ProviderKey") + .IsRequired() + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("ProviderName") + .IsRequired() + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey"); + + b.ToTable("AbpPermissionGrants"); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(128)") + .HasMaxLength(128); + + b.Property("ProviderKey") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("ProviderName") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("Value") + .IsRequired() + .HasColumnType("nvarchar(2048)") + .HasMaxLength(2048); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey"); + + b.ToTable("AbpSettings"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp") + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); + + b.Property("CreationTime") + .HasColumnName("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreatorId") + .HasColumnName("CreatorId") + .HasColumnType("uniqueidentifier"); + + b.Property("DeleterId") + .HasColumnName("DeleterId") + .HasColumnType("uniqueidentifier"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime") + .HasColumnType("datetime2"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId") + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("AbpTenants"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("Value") + .IsRequired() + .HasColumnType("nvarchar(1024)") + .HasMaxLength(1024); + + b.HasKey("TenantId", "Name"); + + b.ToTable("AbpTenantConnectionStrings"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("Actions") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("EntityChanges") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) + .WithMany("PropertyChanges") + .HasForeignKey("EntityChangeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("OrganizationUnits") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("ParentId"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany("Roles") + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + .WithMany("UserClaims") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScope", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + .WithMany("Scopes") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiScopeClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiScope", null) + .WithMany("UserClaims") + .HasForeignKey("ApiResourceId", "Name") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiSecret", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + .WithMany("Secrets") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("Claims") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientCorsOrigin", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("AllowedCorsOrigins") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientGrantType", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("AllowedGrantTypes") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientIdPRestriction", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("IdentityProviderRestrictions") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientPostLogoutRedirectUri", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("PostLogoutRedirectUris") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientProperty", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("Properties") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientRedirectUri", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("RedirectUris") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientScope", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("AllowedScopes") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientSecret", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("ClientSecrets") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", null) + .WithMany("UserClaims") + .HasForeignKey("IdentityResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.HasOne("Volo.Abp.TenantManagement.Tenant", null) + .WithMany("ConnectionStrings") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/samples/MicroserviceDemo/applications/AuthServer.Host/Migrations/20200624024013_SetConcurrencyStampMaxLength.cs b/samples/MicroserviceDemo/applications/AuthServer.Host/Migrations/20200624024013_SetConcurrencyStampMaxLength.cs new file mode 100644 index 0000000000..fd779a7834 --- /dev/null +++ b/samples/MicroserviceDemo/applications/AuthServer.Host/Migrations/20200624024013_SetConcurrencyStampMaxLength.cs @@ -0,0 +1,213 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace AuthServer.Host.Migrations +{ + public partial class SetConcurrencyStampMaxLength : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "ConcurrencyStamp", + table: "IdentityServerPersistedGrants", + maxLength: 40, + nullable: true, + oldClrType: typeof(string), + oldType: "nvarchar(max)", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "ConcurrencyStamp", + table: "IdentityServerIdentityResources", + maxLength: 40, + nullable: true, + oldClrType: typeof(string), + oldType: "nvarchar(max)", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "ConcurrencyStamp", + table: "IdentityServerDeviceFlowCodes", + maxLength: 40, + nullable: true, + oldClrType: typeof(string), + oldType: "nvarchar(max)", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "ConcurrencyStamp", + table: "IdentityServerClients", + maxLength: 40, + nullable: true, + oldClrType: typeof(string), + oldType: "nvarchar(max)", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "ConcurrencyStamp", + table: "IdentityServerApiResources", + maxLength: 40, + nullable: true, + oldClrType: typeof(string), + oldType: "nvarchar(max)", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "ConcurrencyStamp", + table: "AbpUsers", + maxLength: 40, + nullable: true, + oldClrType: typeof(string), + oldType: "nvarchar(max)", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "ConcurrencyStamp", + table: "AbpTenants", + maxLength: 40, + nullable: true, + oldClrType: typeof(string), + oldType: "nvarchar(max)", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "ConcurrencyStamp", + table: "AbpRoles", + maxLength: 40, + nullable: true, + oldClrType: typeof(string), + oldType: "nvarchar(256)", + oldMaxLength: 256); + + migrationBuilder.AlterColumn( + name: "ConcurrencyStamp", + table: "AbpOrganizationUnits", + maxLength: 40, + nullable: true, + oldClrType: typeof(string), + oldType: "nvarchar(max)", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "ConcurrencyStamp", + table: "AbpClaimTypes", + maxLength: 40, + nullable: true, + oldClrType: typeof(string), + oldType: "nvarchar(256)", + oldMaxLength: 256); + + migrationBuilder.AlterColumn( + name: "ConcurrencyStamp", + table: "AbpAuditLogs", + maxLength: 40, + nullable: true, + oldClrType: typeof(string), + oldType: "nvarchar(max)", + oldNullable: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "ConcurrencyStamp", + table: "IdentityServerPersistedGrants", + type: "nvarchar(max)", + nullable: true, + oldClrType: typeof(string), + oldMaxLength: 40, + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "ConcurrencyStamp", + table: "IdentityServerIdentityResources", + type: "nvarchar(max)", + nullable: true, + oldClrType: typeof(string), + oldMaxLength: 40, + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "ConcurrencyStamp", + table: "IdentityServerDeviceFlowCodes", + type: "nvarchar(max)", + nullable: true, + oldClrType: typeof(string), + oldMaxLength: 40, + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "ConcurrencyStamp", + table: "IdentityServerClients", + type: "nvarchar(max)", + nullable: true, + oldClrType: typeof(string), + oldMaxLength: 40, + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "ConcurrencyStamp", + table: "IdentityServerApiResources", + type: "nvarchar(max)", + nullable: true, + oldClrType: typeof(string), + oldMaxLength: 40, + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "ConcurrencyStamp", + table: "AbpUsers", + type: "nvarchar(max)", + nullable: true, + oldClrType: typeof(string), + oldMaxLength: 40, + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "ConcurrencyStamp", + table: "AbpTenants", + type: "nvarchar(max)", + nullable: true, + oldClrType: typeof(string), + oldMaxLength: 40, + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "ConcurrencyStamp", + table: "AbpRoles", + type: "nvarchar(256)", + maxLength: 256, + nullable: false, + oldClrType: typeof(string), + oldMaxLength: 40, + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "ConcurrencyStamp", + table: "AbpOrganizationUnits", + type: "nvarchar(max)", + nullable: true, + oldClrType: typeof(string), + oldMaxLength: 40, + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "ConcurrencyStamp", + table: "AbpClaimTypes", + type: "nvarchar(256)", + maxLength: 256, + nullable: false, + oldClrType: typeof(string), + oldMaxLength: 40, + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "ConcurrencyStamp", + table: "AbpAuditLogs", + type: "nvarchar(max)", + nullable: true, + oldClrType: typeof(string), + oldMaxLength: 40, + oldNullable: true); + } + } +} diff --git a/samples/MicroserviceDemo/applications/AuthServer.Host/Migrations/AuthServerDbContextModelSnapshot.cs b/samples/MicroserviceDemo/applications/AuthServer.Host/Migrations/AuthServerDbContextModelSnapshot.cs index 02d1201e31..c63fb434ce 100644 --- a/samples/MicroserviceDemo/applications/AuthServer.Host/Migrations/AuthServerDbContextModelSnapshot.cs +++ b/samples/MicroserviceDemo/applications/AuthServer.Host/Migrations/AuthServerDbContextModelSnapshot.cs @@ -5,6 +5,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Volo.Abp.EntityFrameworkCore; namespace AuthServer.Host.Migrations { @@ -15,7 +16,8 @@ namespace AuthServer.Host.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "3.1.2") + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "3.1.5") .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); @@ -58,7 +60,8 @@ namespace AuthServer.Host.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CorrelationId") .HasColumnName("CorrelationId") @@ -309,10 +312,9 @@ namespace AuthServer.Host.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .IsRequired() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("Description") .HasColumnType("nvarchar(256)") @@ -357,10 +359,9 @@ namespace AuthServer.Host.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .IsRequired() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("ExtraProperties") .HasColumnName("ExtraProperties") @@ -442,7 +443,8 @@ namespace AuthServer.Host.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -715,7 +717,8 @@ namespace AuthServer.Host.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -809,7 +812,8 @@ namespace AuthServer.Host.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -1020,7 +1024,8 @@ namespace AuthServer.Host.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("ConsentLifetime") .HasColumnType("int"); @@ -1293,7 +1298,8 @@ namespace AuthServer.Host.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -1357,7 +1363,8 @@ namespace AuthServer.Host.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnType("datetime2"); @@ -1418,7 +1425,8 @@ namespace AuthServer.Host.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -1559,7 +1567,8 @@ namespace AuthServer.Host.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") diff --git a/samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/20190408114353_Initial.Designer.cs b/samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/20200624024055_Initial.Designer.cs similarity index 57% rename from samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/20190408114353_Initial.Designer.cs rename to samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/20200624024055_Initial.Designer.cs index d0c67347eb..c73d86ac35 100644 --- a/samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/20190408114353_Initial.Designer.cs +++ b/samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/20200624024055_Initial.Designer.cs @@ -6,59 +6,74 @@ using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using ProductService.Host.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; namespace ProductService.Host.Migrations { [DbContext(typeof(ProductServiceMigrationDbContext))] - [Migration("20190408114353_Initial")] + [Migration("20200624024055_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "2.2.0-rtm-35687") + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "3.1.5") .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); modelBuilder.Entity("ProductManagement.Product", b => { b.Property("Id") - .ValueGeneratedOnAdd(); + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); b.Property("Code") .IsRequired() + .HasColumnType("nvarchar(32)") .HasMaxLength(32); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp"); + .HasColumnName("ConcurrencyStamp") + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") - .HasColumnName("CreationTime"); + .HasColumnName("CreationTime") + .HasColumnType("datetime2"); b.Property("CreatorId") - .HasColumnName("CreatorId"); + .HasColumnName("CreatorId") + .HasColumnType("uniqueidentifier"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties"); + .HasColumnName("ExtraProperties") + .HasColumnType("nvarchar(max)"); b.Property("ImageName") + .HasColumnType("nvarchar(128)") .HasMaxLength(128); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime"); + .HasColumnName("LastModificationTime") + .HasColumnType("datetime2"); b.Property("LastModifierId") - .HasColumnName("LastModifierId"); + .HasColumnName("LastModifierId") + .HasColumnType("uniqueidentifier"); b.Property("Name") .IsRequired() + .HasColumnType("nvarchar(256)") .HasMaxLength(256); - b.Property("Price"); + b.Property("Price") + .HasColumnType("real"); - b.Property("StockCount"); + b.Property("StockCount") + .HasColumnType("int"); b.HasKey("Id"); diff --git a/samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/20190408114353_Initial.cs b/samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/20200624024055_Initial.cs similarity index 95% rename from samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/20190408114353_Initial.cs rename to samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/20200624024055_Initial.cs index 5ee9f460ae..83596eb42b 100644 --- a/samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/20190408114353_Initial.cs +++ b/samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/20200624024055_Initial.cs @@ -13,7 +13,7 @@ namespace ProductService.Host.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: true), LastModificationTime = table.Column(nullable: true), diff --git a/samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/ProductServiceMigrationDbContextModelSnapshot.cs b/samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/ProductServiceMigrationDbContextModelSnapshot.cs index dcbec3288c..34ae699308 100644 --- a/samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/ProductServiceMigrationDbContextModelSnapshot.cs +++ b/samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/ProductServiceMigrationDbContextModelSnapshot.cs @@ -5,6 +5,7 @@ using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using ProductService.Host.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; namespace ProductService.Host.Migrations { @@ -15,48 +16,62 @@ namespace ProductService.Host.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "2.2.0-rtm-35687") + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "3.1.5") .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); modelBuilder.Entity("ProductManagement.Product", b => { b.Property("Id") - .ValueGeneratedOnAdd(); + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); b.Property("Code") .IsRequired() + .HasColumnType("nvarchar(32)") .HasMaxLength(32); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp"); + .HasColumnName("ConcurrencyStamp") + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") - .HasColumnName("CreationTime"); + .HasColumnName("CreationTime") + .HasColumnType("datetime2"); b.Property("CreatorId") - .HasColumnName("CreatorId"); + .HasColumnName("CreatorId") + .HasColumnType("uniqueidentifier"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties"); + .HasColumnName("ExtraProperties") + .HasColumnType("nvarchar(max)"); b.Property("ImageName") + .HasColumnType("nvarchar(128)") .HasMaxLength(128); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime"); + .HasColumnName("LastModificationTime") + .HasColumnType("datetime2"); b.Property("LastModifierId") - .HasColumnName("LastModifierId"); + .HasColumnName("LastModifierId") + .HasColumnType("uniqueidentifier"); b.Property("Name") .IsRequired() + .HasColumnType("nvarchar(256)") .HasMaxLength(256); - b.Property("Price"); + b.Property("Price") + .HasColumnType("real"); - b.Property("StockCount"); + b.Property("StockCount") + .HasColumnType("int"); b.HasKey("Id"); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200525051739_Initial.Designer.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200624023152_Initial.Designer.cs similarity index 98% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200525051739_Initial.Designer.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200624023152_Initial.Designer.cs index c77694a007..174de5bc94 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200525051739_Initial.Designer.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200624023152_Initial.Designer.cs @@ -6,18 +6,20 @@ using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using MyCompanyName.MyProjectName.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameMigrationsDbContext))] - [Migration("20200525051739_Initial")] + [Migration("20200624023152_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "3.1.2") + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "3.1.5") .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); @@ -60,7 +62,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CorrelationId") .HasColumnName("CorrelationId") @@ -281,7 +284,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -368,10 +372,9 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .IsRequired() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("Description") .HasColumnType("nvarchar(256)") @@ -416,10 +419,9 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .IsRequired() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("ExtraProperties") .HasColumnName("ExtraProperties") @@ -501,7 +503,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -774,7 +777,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -868,7 +872,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -1079,7 +1084,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("ConsentLifetime") .HasColumnType("int"); @@ -1352,7 +1358,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -1416,7 +1423,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnType("datetime2"); @@ -1477,7 +1485,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -1618,7 +1627,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200525051739_Initial.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200624023152_Initial.cs similarity index 98% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200525051739_Initial.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200624023152_Initial.cs index 03224bc2b9..b98f3342be 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200525051739_Initial.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/20200624023152_Initial.cs @@ -13,7 +13,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), ApplicationName = table.Column(maxLength: 96, nullable: true), UserId = table.Column(nullable: true), UserName = table.Column(maxLength: 256, nullable: true), @@ -45,7 +45,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), JobName = table.Column(maxLength: 128, nullable: false), JobArgs = table.Column(maxLength: 1048576, nullable: false), TryCount = table.Column(nullable: false, defaultValue: (short)0), @@ -66,7 +66,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 256, nullable: false), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), Name = table.Column(maxLength: 256, nullable: false), Required = table.Column(nullable: false), IsStatic = table.Column(nullable: false), @@ -101,7 +101,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: true), LastModificationTime = table.Column(nullable: true), @@ -146,7 +146,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 256, nullable: false), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), TenantId = table.Column(nullable: true), Name = table.Column(maxLength: 256, nullable: false), NormalizedName = table.Column(maxLength: 256, nullable: false), @@ -180,7 +180,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: true), LastModificationTime = table.Column(nullable: true), @@ -201,7 +201,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: true), LastModificationTime = table.Column(nullable: true), @@ -237,7 +237,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: true), LastModificationTime = table.Column(nullable: true), @@ -262,7 +262,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: true), LastModificationTime = table.Column(nullable: true), @@ -319,7 +319,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: true), DeviceCode = table.Column(maxLength: 200, nullable: false), @@ -340,7 +340,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: true), LastModificationTime = table.Column(nullable: true), @@ -369,7 +369,7 @@ namespace MyCompanyName.MyProjectName.Migrations Key = table.Column(maxLength: 200, nullable: false), Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), Type = table.Column(maxLength: 50, nullable: false), SubjectId = table.Column(maxLength: 200, nullable: true), ClientId = table.Column(maxLength: 200, nullable: false), diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs index d97218fba1..77d771b803 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/Migrations/MyProjectNameMigrationsDbContextModelSnapshot.cs @@ -5,6 +5,7 @@ using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using MyCompanyName.MyProjectName.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { @@ -15,7 +16,8 @@ namespace MyCompanyName.MyProjectName.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "3.1.2") + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "3.1.5") .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); @@ -58,7 +60,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CorrelationId") .HasColumnName("CorrelationId") @@ -279,7 +282,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -366,10 +370,9 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .IsRequired() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("Description") .HasColumnType("nvarchar(256)") @@ -414,10 +417,9 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .IsRequired() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("ExtraProperties") .HasColumnName("ExtraProperties") @@ -499,7 +501,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -772,7 +775,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -866,7 +870,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -1077,7 +1082,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("ConsentLifetime") .HasColumnType("int"); @@ -1350,7 +1356,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -1414,7 +1421,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnType("datetime2"); @@ -1475,7 +1483,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -1616,7 +1625,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200525052535_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200624023331_Initial.Designer.cs similarity index 98% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200525052535_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200624023331_Initial.Designer.cs index d638042c2b..23c25b58cd 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200525052535_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200624023331_Initial.Designer.cs @@ -6,18 +6,20 @@ using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using MyCompanyName.MyProjectName.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(IdentityServerHostMigrationsDbContext))] - [Migration("20200525052535_Initial")] + [Migration("20200624023331_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "3.1.2") + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "3.1.5") .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); @@ -60,7 +62,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CorrelationId") .HasColumnName("CorrelationId") @@ -280,10 +283,9 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .IsRequired() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("Description") .HasColumnType("nvarchar(256)") @@ -328,10 +330,9 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .IsRequired() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("ExtraProperties") .HasColumnName("ExtraProperties") @@ -413,7 +414,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -686,7 +688,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -780,7 +783,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -991,7 +995,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("ConsentLifetime") .HasColumnType("int"); @@ -1264,7 +1269,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -1328,7 +1334,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnType("datetime2"); @@ -1389,7 +1396,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -1530,7 +1538,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200525052535_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200624023331_Initial.cs similarity index 98% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200525052535_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200624023331_Initial.cs index 6269e6d3c8..9287186f86 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200525052535_Initial.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20200624023331_Initial.cs @@ -13,7 +13,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), ApplicationName = table.Column(maxLength: 96, nullable: true), UserId = table.Column(nullable: true), UserName = table.Column(maxLength: 256, nullable: true), @@ -45,7 +45,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 256, nullable: false), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), Name = table.Column(maxLength: 256, nullable: false), Required = table.Column(nullable: false), IsStatic = table.Column(nullable: false), @@ -65,7 +65,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: true), LastModificationTime = table.Column(nullable: true), @@ -110,7 +110,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 256, nullable: false), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), TenantId = table.Column(nullable: true), Name = table.Column(maxLength: 256, nullable: false), NormalizedName = table.Column(maxLength: 256, nullable: false), @@ -144,7 +144,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: true), LastModificationTime = table.Column(nullable: true), @@ -165,7 +165,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: true), LastModificationTime = table.Column(nullable: true), @@ -201,7 +201,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: true), LastModificationTime = table.Column(nullable: true), @@ -226,7 +226,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: true), LastModificationTime = table.Column(nullable: true), @@ -283,7 +283,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: true), DeviceCode = table.Column(maxLength: 200, nullable: false), @@ -304,7 +304,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: true), LastModificationTime = table.Column(nullable: true), @@ -333,7 +333,7 @@ namespace MyCompanyName.MyProjectName.Migrations Key = table.Column(maxLength: 200, nullable: false), Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), Type = table.Column(maxLength: 50, nullable: false), SubjectId = table.Column(maxLength: 200, nullable: true), ClientId = table.Column(maxLength: 200, nullable: false), diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/IdentityServerHostMigrationsDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/IdentityServerHostMigrationsDbContextModelSnapshot.cs index 7e182ee1a4..44c00e04d4 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/IdentityServerHostMigrationsDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/IdentityServerHostMigrationsDbContextModelSnapshot.cs @@ -5,6 +5,7 @@ using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using MyCompanyName.MyProjectName.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { @@ -15,7 +16,8 @@ namespace MyCompanyName.MyProjectName.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "3.1.2") + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "3.1.5") .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); @@ -58,7 +60,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CorrelationId") .HasColumnName("CorrelationId") @@ -278,10 +281,9 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .IsRequired() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("Description") .HasColumnType("nvarchar(256)") @@ -326,10 +328,9 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .IsRequired() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("ExtraProperties") .HasColumnName("ExtraProperties") @@ -411,7 +412,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -684,7 +686,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -778,7 +781,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -989,7 +993,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("ConsentLifetime") .HasColumnType("int"); @@ -1262,7 +1267,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -1326,7 +1332,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnType("datetime2"); @@ -1387,7 +1394,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -1528,7 +1536,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200525052704_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200624023340_Initial.Designer.cs similarity index 97% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200525052704_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200624023340_Initial.Designer.cs index 959380db0c..d93e2804a6 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200525052704_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200624023340_Initial.Designer.cs @@ -6,18 +6,20 @@ using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using MyCompanyName.MyProjectName.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20200525052704_Initial")] + [Migration("20200624023340_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "3.1.2") + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "3.1.5") .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); @@ -60,7 +62,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CorrelationId") .HasColumnName("CorrelationId") @@ -280,10 +283,9 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .IsRequired() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("Description") .HasColumnType("nvarchar(256)") @@ -328,10 +330,9 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .IsRequired() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("ExtraProperties") .HasColumnName("ExtraProperties") @@ -413,7 +414,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -686,7 +688,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -843,7 +846,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200525052704_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200624023340_Initial.cs similarity index 98% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200525052704_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200624023340_Initial.cs index b3ce564cb1..ad7940fa81 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200525052704_Initial.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20200624023340_Initial.cs @@ -13,7 +13,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), ApplicationName = table.Column(maxLength: 96, nullable: true), UserId = table.Column(nullable: true), UserName = table.Column(maxLength: 256, nullable: true), @@ -45,7 +45,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 256, nullable: false), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), Name = table.Column(maxLength: 256, nullable: false), Required = table.Column(nullable: false), IsStatic = table.Column(nullable: false), @@ -65,7 +65,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: true), LastModificationTime = table.Column(nullable: true), @@ -110,7 +110,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 256, nullable: false), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), TenantId = table.Column(nullable: true), Name = table.Column(maxLength: 256, nullable: false), NormalizedName = table.Column(maxLength: 256, nullable: false), @@ -144,7 +144,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: true), LastModificationTime = table.Column(nullable: true), @@ -165,7 +165,7 @@ namespace MyCompanyName.MyProjectName.Migrations { Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: true), LastModificationTime = table.Column(nullable: true), diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs index b0640cec6d..157b210fc4 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs @@ -5,6 +5,7 @@ using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using MyCompanyName.MyProjectName.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { @@ -15,7 +16,8 @@ namespace MyCompanyName.MyProjectName.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "3.1.2") + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "3.1.5") .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); @@ -58,7 +60,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CorrelationId") .HasColumnName("CorrelationId") @@ -278,10 +281,9 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .IsRequired() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("Description") .HasColumnType("nvarchar(256)") @@ -326,10 +328,9 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .IsRequired() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("ExtraProperties") .HasColumnName("ExtraProperties") @@ -411,7 +412,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -684,7 +686,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") @@ -841,7 +844,8 @@ namespace MyCompanyName.MyProjectName.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); b.Property("CreationTime") .HasColumnName("CreationTime") From 92e3eca76751d50cfcea7b623de495907ee09290 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 24 Jun 2020 10:49:42 +0300 Subject: [PATCH 053/190] #2437 Optimize querying and caching the permissions --- .../PermissionManagement/PermissionStore.cs | 66 ++++++++++++++----- 1 file changed, 48 insertions(+), 18 deletions(-) diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs index 2ffd6f80e1..bd8fe7abc2 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System.Linq; +using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Volo.Abp.Authorization.Permissions; @@ -10,17 +11,21 @@ namespace Volo.Abp.PermissionManagement public class PermissionStore : IPermissionStore, ITransientDependency { public ILogger Logger { get; set; } - + protected IPermissionGrantRepository PermissionGrantRepository { get; } + protected IPermissionDefinitionManager PermissionDefinitionManager { get; } + protected IDistributedCache Cache { get; } - + public PermissionStore( IPermissionGrantRepository permissionGrantRepository, - IDistributedCache cache) + IDistributedCache cache, + IPermissionDefinitionManager permissionDefinitionManager) { PermissionGrantRepository = permissionGrantRepository; Cache = cache; + PermissionDefinitionManager = permissionDefinitionManager; Logger = NullLogger.Instance; } @@ -29,7 +34,10 @@ namespace Volo.Abp.PermissionManagement return (await GetCacheItemAsync(name, providerName, providerKey)).IsGranted; } - protected virtual async Task GetCacheItemAsync(string name, string providerName, string providerKey) + protected virtual async Task GetCacheItemAsync( + string name, + string providerName, + string providerKey) { var cacheKey = CalculateCacheKey(name, providerName, providerKey); @@ -43,23 +51,45 @@ namespace Volo.Abp.PermissionManagement return cacheItem; } - Logger.LogDebug($"Not found in the cache, getting from the repository: {cacheKey}"); + Logger.LogDebug($"Not found in the cache: {cacheKey}"); + + cacheItem = new PermissionGrantCacheItem(name, false); + + await SetCacheItemsAsync(providerName, providerKey, name, cacheItem); - cacheItem = new PermissionGrantCacheItem( - name, - (await PermissionGrantRepository.FindAsync(name, providerName, providerKey)) != null - ); + return cacheItem; + } - Logger.LogDebug($"Setting the cache item: {cacheKey}"); + protected virtual async Task SetCacheItemsAsync( + string providerName, + string providerKey, + string currentName, + PermissionGrantCacheItem currentCacheItem) + { + var permissions = PermissionDefinitionManager.GetPermissions(); + + Logger.LogDebug($"Getting all granted permissions from the repository for this provider name,key: {providerName},{providerKey}"); - await Cache.SetAsync( - cacheKey, - cacheItem - ); + var permissionGrants = await PermissionGrantRepository.GetListAsync(providerName, providerKey); - Logger.LogDebug($"Finished setting the cache item: {cacheKey}"); + Logger.LogDebug($"Setting the cache items. Count: {permissions.Count}"); - return cacheItem; + foreach (var permission in permissions) + { + var isGranted = permissionGrants.Any(pg => pg.Name == permission.Name); //TODO: Optimize? Dictionary/Hash + + await Cache.SetAsync( + CalculateCacheKey(permission.Name, providerName, providerKey), + new PermissionGrantCacheItem(permission.Name, isGranted) + ); + + if (permission.Name == currentName) + { + currentCacheItem.IsGranted = isGranted; + } + } + + Logger.LogDebug($"Finished setting the cache items. Count: {permissions.Count}"); } protected virtual string CalculateCacheKey(string name, string providerName, string providerKey) @@ -67,4 +97,4 @@ namespace Volo.Abp.PermissionManagement return PermissionGrantCacheItem.CalculateCacheKey(name, providerName, providerKey); } } -} +} \ No newline at end of file From 929929b81b12a5be84c736760de8cd8ec325670e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 24 Jun 2020 11:05:27 +0300 Subject: [PATCH 054/190] Created initial Volo.Abp.Caching.StackExchangeRedis package #4483 --- framework/Volo.Abp.sln | 7 +++++ .../FodyWeavers.xml | 3 ++ .../FodyWeavers.xsd | 30 +++++++++++++++++++ ...Volo.Abp.Caching.StackExchangeRedis.csproj | 25 ++++++++++++++++ .../AbpCachingStackExchangeRedisModule.cs | 26 ++++++++++++++++ nupkg/common.ps1 | 1 + 6 files changed, 92 insertions(+) create mode 100644 framework/src/Volo.Abp.Caching.StackExchangeRedis/FodyWeavers.xml create mode 100644 framework/src/Volo.Abp.Caching.StackExchangeRedis/FodyWeavers.xsd create mode 100644 framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo.Abp.Caching.StackExchangeRedis.csproj create mode 100644 framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpCachingStackExchangeRedisModule.cs diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index bd364b91b8..5c53bcd38d 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -307,6 +307,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Azure. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.EntityFrameworkCore.Oracle", "src\Volo.Abp.EntityFrameworkCore.Oracle\Volo.Abp.EntityFrameworkCore.Oracle.csproj", "{1738845A-5348-4EB8-B736-CD1D22A808B4}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Caching.StackExchangeRedis", "src\Volo.Abp.Caching.StackExchangeRedis\Volo.Abp.Caching.StackExchangeRedis.csproj", "{2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -913,6 +915,10 @@ Global {1738845A-5348-4EB8-B736-CD1D22A808B4}.Debug|Any CPU.Build.0 = Debug|Any CPU {1738845A-5348-4EB8-B736-CD1D22A808B4}.Release|Any CPU.ActiveCfg = Release|Any CPU {1738845A-5348-4EB8-B736-CD1D22A808B4}.Release|Any CPU.Build.0 = Release|Any CPU + {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1068,6 +1074,7 @@ Global {C44242F7-D55D-4867-AAF4-A786E404312E} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {A80E9A0B-8932-4B5D-83FB-6751708FD484} = {447C8A77-E5F0-4538-8687-7383196D04EA} {1738845A-5348-4EB8-B736-CD1D22A808B4} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/FodyWeavers.xml b/framework/src/Volo.Abp.Caching.StackExchangeRedis/FodyWeavers.xml new file mode 100644 index 0000000000..be0de3a908 --- /dev/null +++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/FodyWeavers.xsd b/framework/src/Volo.Abp.Caching.StackExchangeRedis/FodyWeavers.xsd new file mode 100644 index 0000000000..3f3946e282 --- /dev/null +++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo.Abp.Caching.StackExchangeRedis.csproj b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo.Abp.Caching.StackExchangeRedis.csproj new file mode 100644 index 0000000000..c362c16bff --- /dev/null +++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo.Abp.Caching.StackExchangeRedis.csproj @@ -0,0 +1,25 @@ + + + + + + + netstandard2.0 + Volo.Abp.Caching.StackExchangeRedis + Volo.Abp.Caching.StackExchangeRedis + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + false + false + false + + + + + + + + + + + + diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpCachingStackExchangeRedisModule.cs b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpCachingStackExchangeRedisModule.cs new file mode 100644 index 0000000000..344450057b --- /dev/null +++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpCachingStackExchangeRedisModule.cs @@ -0,0 +1,26 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Modularity; + +namespace Volo.Abp.Caching.StackExchangeRedis +{ + [DependsOn( + typeof(AbpCachingModule) + )] + public class AbpCachingStackExchangeRedisModule : AbpModule + { + public override void ConfigureServices(ServiceConfigurationContext context) + { + var configuration = context.Services.GetConfiguration(); + + context.Services.AddStackExchangeRedisCache(options => + { + var redisConfiguration = configuration["Redis:Configuration"]; + if (!redisConfiguration.IsNullOrEmpty()) + { + options.Configuration = configuration["Redis:Configuration"]; + } + }); + } + } +} \ No newline at end of file diff --git a/nupkg/common.ps1 b/nupkg/common.ps1 index ec4c01dfd4..8815a0a157 100644 --- a/nupkg/common.ps1 +++ b/nupkg/common.ps1 @@ -59,6 +59,7 @@ $projects = ( "framework/src/Volo.Abp.BlobStoring", "framework/src/Volo.Abp.BlobStoring.FileSystem", "framework/src/Volo.Abp.Caching", + "framework/src/Volo.Abp.Caching.StackExchangeRedis", "framework/src/Volo.Abp.Castle.Core", "framework/src/Volo.Abp.Cli.Core", "framework/src/Volo.Abp.Cli", From b55a8e2ec23e7a3c7b938c84c921f1755d345e25 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Wed, 24 Jun 2020 11:33:52 +0300 Subject: [PATCH 055/190] chore: deprecate TableSortDirective --- .../theme-shared/src/lib/directives/table-sort.directive.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/directives/table-sort.directive.ts b/npm/ng-packs/packages/theme-shared/src/lib/directives/table-sort.directive.ts index 6563f55d26..23638b7fe3 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/directives/table-sort.directive.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/directives/table-sort.directive.ts @@ -18,6 +18,11 @@ export interface TableSortOptions { order: SortOrder; } + +/** + * + * @deprecated To be deleted in v3.3 + */ @Directive({ selector: '[abpTableSort]', providers: [SortPipe], From cd0a18a5b868d4ec0f91a952b988b0fcbd9cecad Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Wed, 24 Jun 2020 11:34:13 +0300 Subject: [PATCH 056/190] chore: commented the route animation in application-layout --- .../application-layout/application-layout.component.html | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/application-layout/application-layout.component.html b/npm/ng-packs/packages/theme-basic/src/lib/components/application-layout/application-layout.component.html index bb34ec33f6..eb68dc7df0 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/application-layout/application-layout.component.html +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/application-layout/application-layout.component.html @@ -42,9 +42,7 @@ -
+ +
From d58bd93c2972b961b405c3159ca70029b81927fe Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Wed, 24 Jun 2020 15:25:45 +0300 Subject: [PATCH 057/190] chore: upgrade version of npm packages --- npm/ng-packs/package.json | 34 +-- npm/ng-packs/packages/core/package.json | 6 +- .../packages/theme-shared/package.json | 4 +- npm/ng-packs/yarn.lock | 259 +++++++++--------- 4 files changed, 154 insertions(+), 149 deletions(-) diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index a5cf9861f3..2e3f6721c6 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -34,20 +34,20 @@ "@abp/ng.theme.shared": "~2.9.0", "@abp/utils": "^2.9.0", "@angular-builders/jest": "^9.0.1", - "@angular-devkit/build-angular": "~0.901.7", - "@angular-devkit/build-ng-packagr": "~0.901.7", - "@angular/animations": "~9.1.9", - "@angular/cli": "~9.1.7", - "@angular/common": "~9.1.9", - "@angular/compiler": "~9.1.9", - "@angular/compiler-cli": "~9.1.9", - "@angular/core": "~9.1.9", - "@angular/forms": "~9.1.9", - "@angular/language-service": "~9.1.9", - "@angular/localize": "~9.1.9", - "@angular/platform-browser": "~9.1.9", - "@angular/platform-browser-dynamic": "~9.1.9", - "@angular/router": "~9.1.9", + "@angular-devkit/build-angular": "~0.901.9", + "@angular-devkit/build-ng-packagr": "~0.901.9", + "@angular/animations": "~9.1.11", + "@angular/cli": "~9.1.9", + "@angular/common": "~9.1.11", + "@angular/compiler": "~9.1.11", + "@angular/compiler-cli": "~9.1.11", + "@angular/core": "~9.1.11", + "@angular/forms": "~9.1.11", + "@angular/language-service": "~9.1.11", + "@angular/localize": "~9.1.11", + "@angular/platform-browser": "~9.1.11", + "@angular/platform-browser-dynamic": "~9.1.11", + "@angular/router": "~9.1.11", "@fortawesome/fontawesome-free": "^5.13.0", "@ng-bootstrap/ng-bootstrap": "^6.1.0", "@ngneat/spectator": "^4.5.0", @@ -57,10 +57,10 @@ "@ngxs/router-plugin": "^3.6.2", "@ngxs/storage-plugin": "^3.6.2", "@ngxs/store": "^3.6.2", - "@swimlane/ngx-datatable": "^16.0.0", + "@swimlane/ngx-datatable": "^17.0.0", "@types/jest": "^25.2.3", "@types/node": "^12.11.1", - "angular-oauth2-oidc": "^8.0.4", + "angular-oauth2-oidc": "^9.2.2", "bootstrap": "^4.5.0", "chart.js": "^2.9.3", "codelyzer": "^5.1.2", @@ -82,7 +82,7 @@ "snq": "^1.0.3", "symlink-manager": "^1.5.0", "ts-node": "~7.0.0", - "ts-toolbelt": "^6.3.6", + "ts-toolbelt": "^6.9.9", "tsickle": "^0.37.0", "tslint": "~5.20.0", "typescript": "~3.8.0", diff --git a/npm/ng-packs/packages/core/package.json b/npm/ng-packs/packages/core/package.json index fd326aae58..3a8b9236a1 100644 --- a/npm/ng-packs/packages/core/package.json +++ b/npm/ng-packs/packages/core/package.json @@ -8,15 +8,15 @@ }, "dependencies": { "@abp/utils": "^2.9.0", - "@angular/localize": "~9.1.9", + "@angular/localize": "~9.1.11", "@ngxs/router-plugin": "^3.6.2", "@ngxs/storage-plugin": "^3.6.2", "@ngxs/store": "^3.6.2", - "angular-oauth2-oidc": "^8.0.4", + "angular-oauth2-oidc": "^9.2.2", "just-clone": "^3.1.0", "just-compare": "^1.3.0", "snq": "^1.0.3", - "ts-toolbelt": "^6.3.6" + "ts-toolbelt": "^6.9.9" }, "publishConfig": { "access": "public" diff --git a/npm/ng-packs/packages/theme-shared/package.json b/npm/ng-packs/packages/theme-shared/package.json index 2eb08a7e60..aaadacc5fc 100644 --- a/npm/ng-packs/packages/theme-shared/package.json +++ b/npm/ng-packs/packages/theme-shared/package.json @@ -8,10 +8,10 @@ }, "dependencies": { "@abp/ng.core": "~2.9.0", - "@fortawesome/fontawesome-free": "^5.13.0", + "@fortawesome/fontawesome-free": "^5.13.1", "@ng-bootstrap/ng-bootstrap": "^6.1.0", "@ngx-validate/core": "^0.0.8", - "@swimlane/ngx-datatable": "^16.0.0", + "@swimlane/ngx-datatable": "^17.0.0", "bootstrap": "^4.5.0", "chart.js": "^2.9.3" }, diff --git a/npm/ng-packs/yarn.lock b/npm/ng-packs/yarn.lock index f5d4ff3967..861811b32f 100644 --- a/npm/ng-packs/yarn.lock +++ b/npm/ng-packs/yarn.lock @@ -139,7 +139,15 @@ jest-preset-angular "^8.1.2" lodash "^4.17.10" -"@angular-devkit/architect@0.901.8", "@angular-devkit/architect@>=0.900.0 < 0.1000.0": +"@angular-devkit/architect@0.901.9": + version "0.901.9" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.901.9.tgz#5d849a120449b2f91ec6eef44ddad74ffb7ad810" + integrity sha512-Xokyh7bv4qICHpb5Xui1jPTi6ZZvzR5tbTIxT0DFWqw16TEkFgkNubQsW6mFSR3g3CXdySMfOwWExfa/rE1ggA== + dependencies: + "@angular-devkit/core" "9.1.9" + rxjs "6.5.4" + +"@angular-devkit/architect@>=0.900.0 < 0.1000.0": version "0.901.8" resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.901.8.tgz#d2f5f4c16fba3ed61ee27c7fc72118421ea2b45d" integrity sha512-tK9ZQlubH6n+q+c2J9Wvfcxg3RFuRiTfJriNoodo6GHvtF2KLdPY67w3Gen0Sp172A5Q8Y927NseddNI8RZ/0A== @@ -147,21 +155,21 @@ "@angular-devkit/core" "9.1.8" rxjs "6.5.4" -"@angular-devkit/build-angular@~0.901.7": - version "0.901.8" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.901.8.tgz#6450be4743dacf564af143c85d2a03b7bdd81551" - integrity sha512-W2RTjtPPJRbke6K7Qt9eZOPRGfFBFsYzskxsuxXwkW2RPopj6k1wUWh9Be8CtAMAUlhyPvlzviOtv3F7leYr3w== +"@angular-devkit/build-angular@~0.901.9": + version "0.901.9" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.901.9.tgz#a60c41497e69d663cf2c74778cc72dd262cc09a1" + integrity sha512-eC6iZQR5tr9dz/SkR3/3Y8Fau/2IzEfHlFCf2mqsOLkbc0MWyM/3RcuZQhRGdVOyzDCIbfzJGY0N3ejkEn2EUg== dependencies: - "@angular-devkit/architect" "0.901.8" - "@angular-devkit/build-optimizer" "0.901.8" - "@angular-devkit/build-webpack" "0.901.8" - "@angular-devkit/core" "9.1.8" + "@angular-devkit/architect" "0.901.9" + "@angular-devkit/build-optimizer" "0.901.9" + "@angular-devkit/build-webpack" "0.901.9" + "@angular-devkit/core" "9.1.9" "@babel/core" "7.9.0" "@babel/generator" "7.9.3" "@babel/preset-env" "7.9.0" "@babel/template" "7.8.6" "@jsdevtools/coverage-istanbul-loader" "3.0.3" - "@ngtools/webpack" "9.1.8" + "@ngtools/webpack" "9.1.9" ajv "6.12.0" autoprefixer "9.7.4" babel-loader "8.0.6" @@ -204,7 +212,7 @@ stylus "0.54.7" stylus-loader "3.0.2" terser "4.6.10" - terser-webpack-plugin "2.3.5" + terser-webpack-plugin "3.0.3" tree-kill "1.2.2" webpack "4.42.0" webpack-dev-middleware "3.7.2" @@ -214,18 +222,18 @@ webpack-subresource-integrity "1.4.0" worker-plugin "4.0.3" -"@angular-devkit/build-ng-packagr@~0.901.7": - version "0.901.8" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.901.8.tgz#7a8fee590f0898451c98da410ff36edc160912d9" - integrity sha512-7a419fmAq+uYunVEBm79MncqOvmprH+6QmGXkORYPAKZ+p5wWdu84AM1aKK/l0UaZ335ErxexpEVnbvSVtVc1Q== +"@angular-devkit/build-ng-packagr@~0.901.9": + version "0.901.9" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.901.9.tgz#ade174940ab11da292a773a2b8149f9c6f5e78c3" + integrity sha512-tZvRAJcBSvYEPcwRRdXtpklS/7pf5Y5QvsTuK34MiVZD7T/fBwMtIqGhIq3o0uxVqBnQdpBFxoRgE3DL1AdY7g== dependencies: - "@angular-devkit/architect" "0.901.8" + "@angular-devkit/architect" "0.901.9" rxjs "6.5.4" -"@angular-devkit/build-optimizer@0.901.8": - version "0.901.8" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.901.8.tgz#55a6cecf9b963bac15f84b5db8ec211c82119954" - integrity sha512-k9DynuWKMsJk5xg+LthdsqmOlGVMVP/TEu2odiVty9gnTVlIjs1bUzs+HNAF/w11juIBcVKa690K+FkSCalo9w== +"@angular-devkit/build-optimizer@0.901.9": + version "0.901.9" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.901.9.tgz#c8018de2406c8bbf32bf74cdacd6fa1df384a8d0" + integrity sha512-AcDhE7RHmaVEaDB02MHp1PR2gdUg3+G/12pDC3GeAlfP1GD/sVBpcqPL6DHFp0dMm/FsvSfVSaXpzD7jZBeIKQ== dependencies: loader-utils "2.0.0" source-map "0.7.3" @@ -233,13 +241,13 @@ typescript "3.6.5" webpack-sources "1.4.3" -"@angular-devkit/build-webpack@0.901.8": - version "0.901.8" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.901.8.tgz#19fbac49c3f60c16d6814d61e518431503ab746a" - integrity sha512-OyLfPI0yo1Qg4I1QP8ZxEYVxrf3IDjGfpxlKXqSChpEy5m/uZmBIRDZ/n/G3+32xFc6MWEdU4EHfRrfn17ae/w== +"@angular-devkit/build-webpack@0.901.9": + version "0.901.9" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.901.9.tgz#19e783950b2f22ceaa0c33b07552bd225dcd412b" + integrity sha512-Bha9LruitixhtJm72FGzqfDfgsOsrMT3EbNSql2muyoELIYbLDOvNZjcDD06CPcOAWSg6/tH9caOTFS2Zj9yOw== dependencies: - "@angular-devkit/architect" "0.901.8" - "@angular-devkit/core" "9.1.8" + "@angular-devkit/architect" "0.901.9" + "@angular-devkit/core" "9.1.9" rxjs "6.5.4" "@angular-devkit/core@7.3.10", "@angular-devkit/core@^7.3.6": @@ -275,12 +283,23 @@ rxjs "6.5.4" source-map "0.7.3" -"@angular-devkit/schematics@9.1.8": - version "9.1.8" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-9.1.8.tgz#8eeea0b6f9702a5b065f909cdcaf1d35cc8e2fa3" - integrity sha512-/8L5J4X6SkcFMRmrSQHvJWOPilrMWTNlv1lD+1z06D3xGJEktVxXM3gCUXhDrbMvpoi+lYtR2Fuia0E6zvyjCQ== +"@angular-devkit/core@9.1.9": + version "9.1.9" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-9.1.9.tgz#e6283912093179313ccfc69856841e9b6b318231" + integrity sha512-SWgBh4an/Vezjw2BZ5S+bKvuK5lH6gOtR8d5YjN9vxpJSZ0GimrGjfnLlWOkwWAsU8jfn4JzofECUHwX/7EW6Q== dependencies: - "@angular-devkit/core" "9.1.8" + ajv "6.12.0" + fast-json-stable-stringify "2.1.0" + magic-string "0.25.7" + rxjs "6.5.4" + source-map "0.7.3" + +"@angular-devkit/schematics@9.1.9": + version "9.1.9" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-9.1.9.tgz#1369ee586cb91ffebf12673bb839d31ad5c00357" + integrity sha512-aKuMmS3wshOTl9+01jiB50ml09fRN1WfOOtoNqwvKTEi87DrT6Mn3l0eVQo8PJK/bIq/FBmPgsIl2nsETiBSxg== + dependencies: + "@angular-devkit/core" "9.1.9" ora "4.0.3" rxjs "6.5.4" @@ -300,21 +319,21 @@ "@angular-devkit/core" "8.3.27" rxjs "6.4.0" -"@angular/animations@~9.1.9": +"@angular/animations@~9.1.11": version "9.1.11" resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-9.1.11.tgz#2c7b6e584df0ba0884d05f01fa7ab86c1fdd1c5e" integrity sha512-VKAExUnEJfo1PDQKagpx2pn+QMZCsPLRiADzTdl4U0VPylK3ALbn4ZNY9UbdwyE2plitz++LkH7sEGGfh+PNrQ== -"@angular/cli@~9.1.7": - version "9.1.8" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-9.1.8.tgz#fd143e26c913ccea5b8ac1716e1c168432ac96d3" - integrity sha512-yfF7glPo3Xm7fTJVln1bFZVXqHu8wkIGZRZGb6lsJa+QH4ePxHgn+dNYXho0MYpGUnhY7xOBW4MJzjS7E+1y5Q== +"@angular/cli@~9.1.9": + version "9.1.9" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-9.1.9.tgz#e9caced7c107c65075fe1b4c42a4712a5aeb992c" + integrity sha512-k8C0OY3oHoixd3buCgF8+VFe8YZGSGiprnbVMEF2WJHUUw87lPCu/d7dbID3AtVwdKdAB275rAt6IZEIzXInbw== dependencies: - "@angular-devkit/architect" "0.901.8" - "@angular-devkit/core" "9.1.8" - "@angular-devkit/schematics" "9.1.8" - "@schematics/angular" "9.1.8" - "@schematics/update" "0.901.8" + "@angular-devkit/architect" "0.901.9" + "@angular-devkit/core" "9.1.9" + "@angular-devkit/schematics" "9.1.9" + "@schematics/angular" "9.1.9" + "@schematics/update" "0.901.9" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.1" debug "4.1.1" @@ -331,12 +350,12 @@ universal-analytics "0.4.20" uuid "7.0.2" -"@angular/common@~9.1.9": +"@angular/common@~9.1.11": version "9.1.11" resolved "https://registry.yarnpkg.com/@angular/common/-/common-9.1.11.tgz#1323f7b043410791bd2d0d71b0bbb1f862319c04" integrity sha512-Vh5lF7zWwDK9RedmYXUc8vUXyrecR3j1mAWlTlnmcHYxxFThPzN/dr0slQcPi6nyJn0EmyRKUGvAoZx4rIb7wg== -"@angular/compiler-cli@~9.1.9": +"@angular/compiler-cli@~9.1.11": version "9.1.11" resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-9.1.11.tgz#39da68ddadb52008fe5231141707bddd3aa790b2" integrity sha512-9qIxbtpRXOQnRm6inxCa5HuH87MSuMzuceD0YBVzl8v+vLtewon9KXYMmF4kTBhWa/LEa8FrajljLh0azf3VLg== @@ -354,27 +373,27 @@ sourcemap-codec "^1.4.8" yargs "15.3.0" -"@angular/compiler@~9.1.9": +"@angular/compiler@~9.1.11": version "9.1.11" resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-9.1.11.tgz#4c7100f53c87f47e793e149427b8bdee44302381" integrity sha512-MbVheCG0U8gt6xtiipau20N26mD2sXjLChVmRKgO6rbDruxboNMZfEd94q9NP9JRaUsVnjXvY7GMDldoymdXig== -"@angular/core@~9.1.9": +"@angular/core@~9.1.11": version "9.1.11" resolved "https://registry.yarnpkg.com/@angular/core/-/core-9.1.11.tgz#7a92d27292212ed381be15f9000d4019867f1c7c" integrity sha512-KAlEedBo761O1aeoTJVziOSHi8Fttk9ipvbDZXYT/o0W/KdVwubxP34g9t5aD8LCcF8+L0z4VLw++HjdJAUpwg== -"@angular/forms@~9.1.9": +"@angular/forms@~9.1.11": version "9.1.11" resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-9.1.11.tgz#fa246144649236613598a0471aa7f39b60f986b5" integrity sha512-t4WHrh6ot1r8zdV+3fJz7g9rCok77c9CiIevhH2dR/idxD+HtFR0wqmcBQzsn+rNVB0f0TiSHDrj+TeELIFyWw== -"@angular/language-service@~9.1.9": +"@angular/language-service@~9.1.11": version "9.1.11" resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-9.1.11.tgz#a2afed4f0167e6f4d3d748214b8e1c27980703ce" integrity sha512-jfm4etbqldj6MTwECwyoAs7tXEAR8K/8P8dBZnsELhY+V8oFidTJI3NY52PB3Ym7leSPorYdOAeUMMuQfPaVxg== -"@angular/localize@~9.1.0", "@angular/localize@~9.1.9": +"@angular/localize@~9.1.0", "@angular/localize@~9.1.11": version "9.1.11" resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-9.1.11.tgz#25921d794836fb7a07d284c1ac0ed06c10e77d50" integrity sha512-CrR7RniwJIK3+QKH8nHl35KDAHZn1mp1QAd5vujTWKw6YRLfio7SjM9qIfzw5y4WZuUitTsqKlQT/m/NK146Ag== @@ -383,17 +402,17 @@ glob "7.1.2" yargs "15.3.0" -"@angular/platform-browser-dynamic@~9.1.9": +"@angular/platform-browser-dynamic@~9.1.11": version "9.1.11" resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.11.tgz#82af336b05e0d7b7478a2ca7f6282825b211f340" integrity sha512-Qw3rfVFF0Wtu+UwraqKPCgTA3uoNPGf4vKSfuCuXTrG0p7j+3mCP59aUv5gGH7GV1UQ++jZRx5pbWF43zrC8Hw== -"@angular/platform-browser@~9.1.9": +"@angular/platform-browser@~9.1.11": version "9.1.11" resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-9.1.11.tgz#4da8e2a4231d5162304746a39f54cb2d3f241b7c" integrity sha512-KDxoiFhW4UD+EqchcKpQVSLwg9Rd3JbWytZLchFV6nH8BFnshfJtw2tyPT8bMhFVG9n9zSR4QSGaozWgoDs9mw== -"@angular/router@~9.1.9": +"@angular/router@~9.1.11": version "9.1.11" resolved "https://registry.yarnpkg.com/@angular/router/-/router-9.1.11.tgz#b6d28af55fe5631bbc46f306a0e7866253d4f3b1" integrity sha512-D6CCDeSK/F6dWSB/a1g/zB072xG5LadLSV8afQ57oX1KHePx21LcoRG4tUtFMMHh/jZXRc9pMQIR1/9FrrXF3Q== @@ -2269,12 +2288,12 @@ schematics-utilities "^1.1.1" tslib "^1.9.0" -"@ngtools/webpack@9.1.8": - version "9.1.8" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-9.1.8.tgz#50a906047b284098e5cd669e8174c9cfcaf3bafc" - integrity sha512-2Y27PrHLMyrIDmuicjp2OU7KIr9bggwMLNZdjfpcuXlOPP/BYviuhgkkYsfJysrpDRUJUHlXRJG7OJbgyFM7gQ== +"@ngtools/webpack@9.1.9": + version "9.1.9" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-9.1.9.tgz#2098afd6f1f028238468262df2ad10afa81b82a5" + integrity sha512-7UzRL54JcK1m2PvgpchV26TF9OYipj/8+dygdjaidqOyQujWpHncdtq/ScbUsoJ44nHjIRJPhaGE00NLpWZvnA== dependencies: - "@angular-devkit/core" "9.1.8" + "@angular-devkit/core" "9.1.9" enhanced-resolve "4.1.1" rxjs "6.5.4" webpack-sources "1.4.3" @@ -2503,21 +2522,21 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@schematics/angular@9.1.8": - version "9.1.8" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-9.1.8.tgz#da6cd63b65776b18c43d8515bfca754dd9acdbc9" - integrity sha512-fjyAP9m4aF51OVdksRXCOF8BTyt96PqFmKK9G0kuwOzgfx2gPZNOO3wOZH6xFAMZ09y86VGzasZxZNeDdyN4sQ== +"@schematics/angular@9.1.9": + version "9.1.9" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-9.1.9.tgz#df9f30dd7b63856121fbb9ab5dda57b443802a33" + integrity sha512-c8YGZ6pDfr8IDD1qaOjlEBAkEz14KFSxDj0hCWs0xIM0py513tu5sW8+ziYxGG4bgqpsgVR/KAxuY78iBfUVag== dependencies: - "@angular-devkit/core" "9.1.8" - "@angular-devkit/schematics" "9.1.8" + "@angular-devkit/core" "9.1.9" + "@angular-devkit/schematics" "9.1.9" -"@schematics/update@0.901.8": - version "0.901.8" - resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.901.8.tgz#d48be9931a2462062d4d4ac05c4b24b319bc064a" - integrity sha512-v1tEYX6yM5vuwXW7AG7OZ4OtjqRwTo3kd69LVJyOdF/d9HlqaAFU301RuEsAPwOrPqZEQdTwklH1fNJnqgpB/w== +"@schematics/update@0.901.9": + version "0.901.9" + resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.901.9.tgz#6285611910ebf8bb4078447d2ba32931595efcd4" + integrity sha512-VChX0VO/oyfCF3y+HjMTU2qN3vGgJYxEI1V+Q9aAlwl95t3GAufuaFY1CNW3YV4XkYIjD88e3yWl8d5yO4qf4w== dependencies: - "@angular-devkit/core" "9.1.8" - "@angular-devkit/schematics" "9.1.8" + "@angular-devkit/core" "9.1.9" + "@angular-devkit/schematics" "9.1.9" "@yarnpkg/lockfile" "1.1.0" ini "1.3.5" npm-package-arg "^8.0.0" @@ -2543,12 +2562,10 @@ dependencies: type-detect "4.0.8" -"@swimlane/ngx-datatable@^16.0.0": - version "16.1.1" - resolved "https://registry.yarnpkg.com/@swimlane/ngx-datatable/-/ngx-datatable-16.1.1.tgz#1215e81f51400314ba6899f66acdbd4e3bde2915" - integrity sha512-h2A9xC/jo314eC/CzA19aoY/YadhdTupolCwpgB9Cbw3sDRi3x/LeGsdLSV0bj3XBKQUB3DA/gPuASKYuhm8iA== - dependencies: - tslib "^1.9.0" +"@swimlane/ngx-datatable@^17.0.0": + version "17.0.0" + resolved "https://registry.yarnpkg.com/@swimlane/ngx-datatable/-/ngx-datatable-17.0.0.tgz#76b63fa93635f1fb89107bee901f87588b27a2a7" + integrity sha512-6ydjOL3hIGIdDHgseCNalrFac3I3fFUwxbKjVw0dCL0ZrET4A3P+uIOg9vK4XKL/a19Eg8ivEJ7bBg0W/6dxQw== "@szmarczak/http-timer@^1.1.2": version "1.1.2" @@ -3093,6 +3110,13 @@ angular-oauth2-oidc@^8.0.4: jsrsasign "^8.0.12" tslib "^1.9.0" +angular-oauth2-oidc@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/angular-oauth2-oidc/-/angular-oauth2-oidc-9.2.2.tgz#2b888337953a8773e0269b5ef1709f30316448f1" + integrity sha512-aMQXeujzhubvxGw3ujw9FGwTC+L8m7CXnzVntpNJRkJsgMiuZFrXzgeiG87tvAE61J+PlOVIb/UkJjYDgDVU6Q== + dependencies: + js-sha256 "^0.9.0" + ansi-align@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" @@ -3910,30 +3934,6 @@ cacache@^12.0.0, cacache@^12.0.2, cacache@^12.0.3: unique-filename "^1.1.1" y18n "^4.0.0" -cacache@^13.0.1: - version "13.0.1" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" - integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w== - dependencies: - chownr "^1.1.2" - figgy-pudding "^3.5.1" - fs-minipass "^2.0.0" - glob "^7.1.4" - graceful-fs "^4.2.2" - infer-owner "^1.0.4" - lru-cache "^5.1.1" - minipass "^3.0.0" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - p-map "^3.0.0" - promise-inflight "^1.0.1" - rimraf "^2.7.1" - ssri "^7.0.0" - unique-filename "^1.1.1" - cacache@^15.0.4: version "15.0.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.4.tgz#b2c23cf4ac4f5ead004fb15a0efb0a20340741f1" @@ -6210,7 +6210,7 @@ finalhandler@~1.1.2: statuses "~1.5.0" unpipe "~1.0.0" -find-cache-dir@3.3.1, find-cache-dir@^3.2.0, find-cache-dir@^3.3.1: +find-cache-dir@3.3.1, find-cache-dir@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== @@ -8196,7 +8196,7 @@ jest-worker@25.1.0: merge-stream "^2.0.0" supports-color "^7.0.0" -jest-worker@^25.1.0, jest-worker@^25.5.0: +jest-worker@^25.5.0: version "25.5.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== @@ -8204,6 +8204,14 @@ jest-worker@^25.1.0, jest-worker@^25.5.0: merge-stream "^2.0.0" supports-color "^7.0.0" +jest-worker@^26.0.0: + version "26.1.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.1.0.tgz#65d5641af74e08ccd561c240e7db61284f82f33d" + integrity sha512-Z9P5pZ6UC+kakMbNJn+tA2RdVdNX5WH1x+5UCBZ9MxIK24pjYtFt96fK+UwBTrjLYm232g1xz0L3eTh51OW+yQ== + dependencies: + merge-stream "^2.0.0" + supports-color "^7.0.0" + jest@^25.0.0: version "25.5.4" resolved "https://registry.yarnpkg.com/jest/-/jest-25.5.4.tgz#f21107b6489cfe32b076ce2adcadee3587acb9db" @@ -8218,6 +8226,11 @@ jquery@3.4.1: resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2" integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw== +js-sha256@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" + integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -9942,7 +9955,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.2.2, p-limit@^2.3.0: +p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -11722,7 +11735,7 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.5.0, schema-utils@^2.6.1, schema-utils@^2.6.4, schema-utils@^2.6.5, schema-utils@^2.7.0: +schema-utils@^2.5.0, schema-utils@^2.6.1, schema-utils@^2.6.4, schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== @@ -11830,11 +11843,6 @@ send@0.17.1: range-parser "~1.2.1" statuses "~1.5.0" -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== - serialize-javascript@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea" @@ -12264,14 +12272,6 @@ ssri@^6.0.0, ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" -ssri@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d" - integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g== - dependencies: - figgy-pudding "^3.5.1" - minipass "^3.1.1" - ssri@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.0.tgz#79ca74e21f8ceaeddfcb4b90143c458b8d988808" @@ -12705,19 +12705,19 @@ terminal-link@^2.0.0: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" -terser-webpack-plugin@2.3.5: - version "2.3.5" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz#5ad971acce5c517440ba873ea4f09687de2f4a81" - integrity sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w== +terser-webpack-plugin@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-3.0.3.tgz#23bda2687b197f878a743373b9411d917adc2e45" + integrity sha512-bZFnotuIKq5Rqzrs+qIwFzGdKdffV9epG5vDSEbYzvKAhPeR5RbbrQysfPgbIIMhNAQtZD2hGwBfSKUXjXZZZw== dependencies: - cacache "^13.0.1" - find-cache-dir "^3.2.0" - jest-worker "^25.1.0" - p-limit "^2.2.2" - schema-utils "^2.6.4" - serialize-javascript "^2.1.2" + cacache "^15.0.4" + find-cache-dir "^3.3.1" + jest-worker "^26.0.0" + p-limit "^2.3.0" + schema-utils "^2.6.6" + serialize-javascript "^3.1.0" source-map "^0.6.1" - terser "^4.4.3" + terser "^4.6.13" webpack-sources "^1.4.3" terser-webpack-plugin@^1.4.3: @@ -12744,7 +12744,7 @@ terser@4.6.10: source-map "~0.6.1" source-map-support "~0.5.12" -terser@^4.1.2, terser@^4.3.8, terser@^4.4.3: +terser@^4.1.2, terser@^4.3.8, terser@^4.6.13: version "4.8.0" resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== @@ -12978,6 +12978,11 @@ ts-toolbelt@^6.3.6: resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-6.9.4.tgz#cc3a070d99c557c552b4f69e36f13d430c47a760" integrity sha512-muRZZqfOTOVvLk5cdnp7YWm6xX+kD/WL2cS/L4zximBRcbQSuMoTbQQ2ZZBVMs1gB0EZw1qThP+HrIQB35OmEw== +ts-toolbelt@^6.9.9: + version "6.9.9" + resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-6.9.9.tgz#e6cfd8ec7d425d2a06bda3b4fe9577ceaf2abda8" + integrity sha512-5a8k6qfbrL54N4Dw+i7M6kldrbjgDWb5Vit8DnT+gwThhvqMg8KtxLE5Vmnft+geIgaSOfNJyAcnmmlflS+Vdg== + tsickle@^0.37.0: version "0.37.1" resolved "https://registry.yarnpkg.com/tsickle/-/tsickle-0.37.1.tgz#2f8a87c1b15766e866457bd06fb6c0e0d84eed09" From 0b9b7444ebd3e2bf6de4fa783288d3f66e7059c3 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Wed, 24 Jun 2020 15:26:02 +0300 Subject: [PATCH 058/190] fix: angular2-oauth-oidc logout error --- .../packages/core/src/lib/services/auth.service.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/services/auth.service.ts b/npm/ng-packs/packages/core/src/lib/services/auth.service.ts index 0c38b22acf..35f667bf20 100644 --- a/npm/ng-packs/packages/core/src/lib/services/auth.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/auth.service.ts @@ -20,14 +20,14 @@ export class AuthService { private oAuthService: OAuthService, private store: Store, @Optional() @Inject('ACCOUNT_OPTIONS') private options: any, - ) {} - - login(username: string, password: string): Observable { - const tenant = this.store.selectSnapshot(SessionState.getTenant); - + ) { this.oAuthService.configure( this.store.selectSnapshot(ConfigState.getOne('environment')).oAuthConfig, ); + } + + login(username: string, password: string): Observable { + const tenant = this.store.selectSnapshot(SessionState.getTenant); return from(this.oAuthService.loadDiscoveryDocument()).pipe( switchMap(() => @@ -63,7 +63,7 @@ export class AuthService { ) .pipe( switchMap(() => { - this.oAuthService.logOut(); + this.oAuthService.logOut(true); return this.store.dispatch(new GetAppConfiguration()); }), ); From 61524bd6f9e28ce64a6b1c0cbf34317fd871bb79 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Wed, 24 Jun 2020 15:29:58 +0300 Subject: [PATCH 059/190] feat: use NgbNavModule instead of NgbTabsetModule --- .../lib/components/users/users.component.html | 185 +++++++++--------- .../identity/src/lib/identity.module.ts | 4 +- .../tempkey.rsa | 13 ++ 3 files changed, 108 insertions(+), 94 deletions(-) create mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/tempkey.rsa 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 648b1024d0..bf49550f12 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 @@ -102,109 +102,110 @@ >
- - - -
-
- * - -
+ + +
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 9aeadac6a2..036c7e3607 100644 --- a/npm/ng-packs/packages/identity/src/lib/identity.module.ts +++ b/npm/ng-packs/packages/identity/src/lib/identity.module.ts @@ -2,7 +2,7 @@ import { CoreModule, LazyModuleFactory } from '@abp/ng.core'; import { PermissionManagementModule } from '@abp/ng.permission-management'; import { ThemeSharedModule } from '@abp/ng.theme.shared'; import { ModuleWithProviders, NgModule, NgModuleFactory } from '@angular/core'; -import { NgbDropdownModule, NgbTabsetModule } from '@ng-bootstrap/ng-bootstrap'; +import { NgbDropdownModule, NgbNavModule } from '@ng-bootstrap/ng-bootstrap'; import { NgxValidateCoreModule } from '@ngx-validate/core'; import { NgxsModule } from '@ngxs/store'; import { RolesComponent } from './components/roles/roles.component'; @@ -17,7 +17,7 @@ import { IdentityState } from './states/identity.state'; NgxsModule.forFeature([IdentityState]), CoreModule, IdentityRoutingModule, - NgbTabsetModule, + NgbNavModule, ThemeSharedModule, NgbDropdownModule, PermissionManagementModule, diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/tempkey.rsa b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/tempkey.rsa new file mode 100644 index 0000000000..494c2013e3 --- /dev/null +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/tempkey.rsa @@ -0,0 +1,13 @@ +{ + "KeyId": "f788zGVUZh9H-HbWL1S-Mg", + "Parameters": { + "D": "F19hbC5PLO872DszGiJnVoU55ee7XGXmNf0KEKndJ/uGBv5lWklXA0QF80h1ytWXde0jV5isQPB1t7mPhRQlDoDTkywLi1CeOgBPbxzHEfLjZZ5c4olfeX0IJX9BDqgUntY0H1a/+Om/eDu4OZUz3EIJFFZBgz46YZSyTT6ZDvAEdpC/o66sNJmxvJIp+8zVoVDSqBUzxmc+oEamXLg7r2jdymxJMxau1kQFxEGLOrJnNxGsEe8UrYA3qSsm8m/Xg4uOh7RYgnuEEt88+KTvRq+CAMWhN3YNLtOJ3NmXowwE7e1Ma+jih9+UVfxZn14P5+SOJbQ2bYV2sCV+2vBiCQ==", + "DP": "oPiGO/qdOQfFEAS9fMInQnsrNylIZVpDYEVoDJ6/jQfE/IpuwxGcmsaGvCob3SKxZiJRLCWpwJYo1hCh/JOSVGWMkVyELky56nbbkkV5ymKLSGZ4JoetdQs+GchnPdR+k2P9Ij1Kjk13ylubN3htzNhcBASJpOfSEv5pPVzGKX0=", + "DQ": "z6imxLABHkyftbfUUtpeOlPanEHgpuIjmUdp3T1Ju1jziE63UEhuj0GPAXOF17uYxixwYE8JhOJ7+TyIK9oZeI3zH2OzJqQh8f5PCQ/E+0ULXZDeNV/ShDLCTufu3Fis9Rt64uTp/H/l21oMQ79jc0ysa8DTz1ReJLRc5qjL41U=", + "Exponent": "AQAB", + "InverseQ": "ieZcvSt5XYukKJKhXpv5Dm/1RD7iH88cZnhLSTEVTMoOUHoYWmApY5pNLGahbfjA9bxnkBWDYex/i7wE9uNNY5CsA6ovUaQLVJDt3kHvR9W+9QtN8D6jjG2TuRbbOdEg4RqhfjUaDfDIgTJX2Wxc8U98FOvOyGw1HzwUPFZKecM=", + "Modulus": "vk4z1Bmtmbo+gxITcY+FIlXzcO2wTOGlOXK5GMYj/6PUMFt7lbqkc72AkPsrAo5/JE8LYLhWj7fzSKbjvtowHCz5m2t+FlUYmuiKpvvnJsTqvQrckNlbZ1nm071q5PhP3Dar/OksfBhPtAX+c3+NjDnM/w53ccJJNaBDO/s9JYoN7vH5n6ed1pMSK71hmg4MPsxChcnc1f1PpnG2mqyJ253+GEUbj/kRyeBSmCCr9aadov2ZzxIKVaFNagJEHOzanQmorSLpP25GfOHCuy27Zkef94V/qU9elzjbH4uIKslVGx5T6H99TYh0sUGu11NytYJa5WNAZWow95CzurC2vw==", + "P": "4GMCQy+XTNzR5TsgFcdAZv2K6TcQR13fHVvPoxQp/b32V5YUJOBFEUAtqociy5ro4+KzpXP5WPSk1ZtznGKuNZyLq8gTnhpB3rwd0sdo4zxKnQ5nu+n1UhlhWNxg5A9V5TaciUAyPrHWJfLoYTQWygNTgJELQH5zZXi2ihC2uiU=", + "Q": "2R36pamnLAJggkPJxiW5qH6HizZ+bkQVg0BBftMLzkAM8Y9CwTW75GRUzGEJFpMckkw0GZSYb1Uwl3DVUpkcQ8LZ91IPYdPpDlYUshhIxl184M55pnO14besKxJtMZ64zhHKVAR2pBMO0n6W4/1iBXkkQqyPViJxdfvXPJMBbhM=" + } +} \ No newline at end of file From 82baa238d448919909d00a96c92db4981a091463 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 24 Jun 2020 16:22:35 +0300 Subject: [PATCH 060/190] Added AbpRedisCache that replaces the RedisCache --- framework/Volo.Abp.sln | 7 +++ .../AbpCachingStackExchangeRedisModule.cs | 4 ++ .../StackExchangeRedis/AbpRedisCache.cs | 49 +++++++++++++++++++ ...bp.Caching.StackExchangeRedis.Tests.csproj | 17 +++++++ .../AbpCachingStackExchangeRedisTestBase.cs | 12 +++++ .../AbpCachingStackExchangeRedisTestModule.cs | 15 ++++++ .../StackExchangeRedis/AbpRedisCache_Tests.cs | 22 +++++++++ 7 files changed, 126 insertions(+) create mode 100644 framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs create mode 100644 framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo.Abp.Caching.StackExchangeRedis.Tests.csproj create mode 100644 framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo/Abp/Caching/StackExchangeRedis/AbpCachingStackExchangeRedisTestBase.cs create mode 100644 framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo/Abp/Caching/StackExchangeRedis/AbpCachingStackExchangeRedisTestModule.cs create mode 100644 framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache_Tests.cs diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index 5c53bcd38d..a3ee894572 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -309,6 +309,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.EntityFrameworkCor EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Caching.StackExchangeRedis", "src\Volo.Abp.Caching.StackExchangeRedis\Volo.Abp.Caching.StackExchangeRedis.csproj", "{2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Caching.StackExchangeRedis.Tests", "test\Volo.Abp.Caching.StackExchangeRedis.Tests\Volo.Abp.Caching.StackExchangeRedis.Tests.csproj", "{60D0E384-965E-4F81-9D71-B28F419254FC}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -919,6 +921,10 @@ Global {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}.Debug|Any CPU.Build.0 = Debug|Any CPU {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}.Release|Any CPU.ActiveCfg = Release|Any CPU {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}.Release|Any CPU.Build.0 = Release|Any CPU + {60D0E384-965E-4F81-9D71-B28F419254FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {60D0E384-965E-4F81-9D71-B28F419254FC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {60D0E384-965E-4F81-9D71-B28F419254FC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {60D0E384-965E-4F81-9D71-B28F419254FC}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1075,6 +1081,7 @@ Global {A80E9A0B-8932-4B5D-83FB-6751708FD484} = {447C8A77-E5F0-4538-8687-7383196D04EA} {1738845A-5348-4EB8-B736-CD1D22A808B4} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {60D0E384-965E-4F81-9D71-B28F419254FC} = {447C8A77-E5F0-4538-8687-7383196D04EA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpCachingStackExchangeRedisModule.cs b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpCachingStackExchangeRedisModule.cs index 344450057b..b0f7d68ee4 100644 --- a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpCachingStackExchangeRedisModule.cs +++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpCachingStackExchangeRedisModule.cs @@ -1,5 +1,7 @@ using System; +using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using Volo.Abp.Modularity; namespace Volo.Abp.Caching.StackExchangeRedis @@ -21,6 +23,8 @@ namespace Volo.Abp.Caching.StackExchangeRedis options.Configuration = configuration["Redis:Configuration"]; } }); + + context.Services.Replace(ServiceDescriptor.Singleton()); } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs new file mode 100644 index 0000000000..a5236022f3 --- /dev/null +++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs @@ -0,0 +1,49 @@ +using System; +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Caching.StackExchangeRedis; +using Microsoft.Extensions.Options; +using StackExchange.Redis; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Caching.StackExchangeRedis +{ + [DisableConventionalRegistration] + public class AbpRedisCache : RedisCache + { + private static readonly FieldInfo RedisDatabaseField; + private static readonly MethodInfo ConnectMethod; + private static readonly MethodInfo ConnectAsyncMethod; + + protected IDatabase RedisDatabase => RedisDatabaseField.GetValue(this) as IDatabase; + + static AbpRedisCache() + { + RedisDatabaseField = typeof(RedisCache) + .GetField("_cache", BindingFlags.Instance | BindingFlags.NonPublic); + + ConnectMethod = typeof(RedisCache) + .GetMethod("Connect", BindingFlags.Instance | BindingFlags.NonPublic); + + ConnectAsyncMethod = typeof(RedisCache) + .GetMethod("ConnectAsync", BindingFlags.Instance | BindingFlags.NonPublic); + } + + public AbpRedisCache(IOptions optionsAccessor) + : base(optionsAccessor) + { + + } + + protected virtual void Connect() + { + ConnectMethod.Invoke(this, Array.Empty()); + } + + protected virtual Task ConnectAsync(CancellationToken token = default) + { + return (Task) ConnectAsyncMethod.Invoke(this, new object[] {token}); + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo.Abp.Caching.StackExchangeRedis.Tests.csproj b/framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo.Abp.Caching.StackExchangeRedis.Tests.csproj new file mode 100644 index 0000000000..15f4bc8b9d --- /dev/null +++ b/framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo.Abp.Caching.StackExchangeRedis.Tests.csproj @@ -0,0 +1,17 @@ + + + + + + netcoreapp3.1 + + + + + + + + + + + diff --git a/framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo/Abp/Caching/StackExchangeRedis/AbpCachingStackExchangeRedisTestBase.cs b/framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo/Abp/Caching/StackExchangeRedis/AbpCachingStackExchangeRedisTestBase.cs new file mode 100644 index 0000000000..354ce3cc2b --- /dev/null +++ b/framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo/Abp/Caching/StackExchangeRedis/AbpCachingStackExchangeRedisTestBase.cs @@ -0,0 +1,12 @@ +using Volo.Abp.Testing; + +namespace Volo.Abp.Caching.StackExchangeRedis +{ + public abstract class AbpCachingStackExchangeRedisTestBase : AbpIntegratedTest + { + protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) + { + options.UseAutofac(); + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo/Abp/Caching/StackExchangeRedis/AbpCachingStackExchangeRedisTestModule.cs b/framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo/Abp/Caching/StackExchangeRedis/AbpCachingStackExchangeRedisTestModule.cs new file mode 100644 index 0000000000..5d67ae743a --- /dev/null +++ b/framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo/Abp/Caching/StackExchangeRedis/AbpCachingStackExchangeRedisTestModule.cs @@ -0,0 +1,15 @@ +using Volo.Abp.Autofac; +using Volo.Abp.Modularity; + +namespace Volo.Abp.Caching.StackExchangeRedis +{ + [DependsOn( + typeof(AbpCachingStackExchangeRedisModule), + typeof(AbpTestBaseModule), + typeof(AbpAutofacModule) + )] + public class AbpCachingStackExchangeRedisTestModule : AbpModule + { + + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache_Tests.cs b/framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache_Tests.cs new file mode 100644 index 0000000000..660c8dbdb7 --- /dev/null +++ b/framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache_Tests.cs @@ -0,0 +1,22 @@ +using Microsoft.Extensions.Caching.Distributed; +using Shouldly; +using Xunit; + +namespace Volo.Abp.Caching.StackExchangeRedis +{ + public class AbpRedisCache_Tests : AbpCachingStackExchangeRedisTestBase + { + private readonly IDistributedCache _distributedCache; + + public AbpRedisCache_Tests() + { + _distributedCache = GetRequiredService(); + } + + [Fact] + public void Should_Replace_RedisCache() + { + (_distributedCache is AbpRedisCache).ShouldBeTrue(); + } + } +} \ No newline at end of file From d77f155979410bee08ee54a45b4e8a19a06c75df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 24 Jun 2020 16:25:56 +0300 Subject: [PATCH 061/190] Use new Volo.Abp.Caching.StackExchangeRedis from the startup template. --- .../MyCompanyName.MyProjectName.HttpApi.Host.csproj | 2 +- .../MyProjectNameHttpApiHostModule.cs | 7 ++----- .../MyCompanyName.MyProjectName.IdentityServer.csproj | 3 +-- .../MyProjectNameIdentityServerModule.cs | 7 ++----- .../MyCompanyName.MyProjectName.Web.Host.csproj | 2 +- .../MyProjectNameWebModule.cs | 8 +++----- 6 files changed, 10 insertions(+), 19 deletions(-) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj index 41f685bd4f..a632006046 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj @@ -15,11 +15,11 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs index 591b92ae44..6bab8b24f2 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs @@ -19,6 +19,7 @@ using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; using Volo.Abp.AspNetCore.Serilog; using Volo.Abp.Autofac; using Volo.Abp.Caching; +using Volo.Abp.Caching.StackExchangeRedis; using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.VirtualFileSystem; @@ -28,6 +29,7 @@ namespace MyCompanyName.MyProjectName [DependsOn( typeof(MyProjectNameHttpApiModule), typeof(AbpAutofacModule), + typeof(AbpCachingStackExchangeRedisModule), typeof(AbpAspNetCoreMvcUiMultiTenancyModule), typeof(MyProjectNameApplicationModule), typeof(MyProjectNameEntityFrameworkCoreDbMigrationsModule), @@ -124,11 +126,6 @@ namespace MyCompanyName.MyProjectName IConfiguration configuration, IWebHostEnvironment hostingEnvironment) { - context.Services.AddStackExchangeRedisCache(options => - { - options.Configuration = configuration["Redis:Configuration"]; - }); - if (!hostingEnvironment.IsDevelopment()) { var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj index 9478cef991..dd569c7092 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj @@ -35,16 +35,15 @@ - + - diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs index 8d23b73d0f..caa21c9706 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs @@ -23,6 +23,7 @@ using Volo.Abp.Auditing; using Volo.Abp.Autofac; using Volo.Abp.BackgroundJobs; using Volo.Abp.Caching; +using Volo.Abp.Caching.StackExchangeRedis; using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.UI.Navigation.Urls; @@ -33,6 +34,7 @@ namespace MyCompanyName.MyProjectName { [DependsOn( typeof(AbpAutofacModule), + typeof(AbpCachingStackExchangeRedisModule), typeof(AbpAccountWebIdentityServerModule), typeof(AbpAccountApplicationModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule), @@ -103,11 +105,6 @@ namespace MyCompanyName.MyProjectName options.KeyPrefix = "MyProjectName:"; }); - context.Services.AddStackExchangeRedisCache(options => - { - options.Configuration = configuration["Redis:Configuration"]; - }); - if (!hostingEnvironment.IsDevelopment()) { var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj index a39def545b..16066b7e4d 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj @@ -21,12 +21,12 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs index 9e1930a260..689fe33eca 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs @@ -26,6 +26,7 @@ using Volo.Abp.AspNetCore.Serilog; using Volo.Abp.Autofac; using Volo.Abp.AutoMapper; using Volo.Abp.Caching; +using Volo.Abp.Caching.StackExchangeRedis; using Volo.Abp.FeatureManagement; using Volo.Abp.Http.Client.IdentityModel.Web; using Volo.Abp.Identity.Web; @@ -47,6 +48,7 @@ namespace MyCompanyName.MyProjectName.Web typeof(AbpAspNetCoreMvcClientModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule), typeof(AbpAutofacModule), + typeof(AbpCachingStackExchangeRedisModule), typeof(AbpFeatureManagementWebModule), typeof(AbpHttpClientIdentityModelWebModule), typeof(AbpIdentityWebModule), @@ -74,6 +76,7 @@ namespace MyCompanyName.MyProjectName.Web var configuration = context.Services.GetConfiguration(); ConfigureCache(configuration); + ConfigureRedis(context, configuration, hostingEnvironment); ConfigureUrls(configuration); ConfigureAuthentication(context, configuration); ConfigureAutoMapper(); @@ -194,11 +197,6 @@ namespace MyCompanyName.MyProjectName.Web IConfiguration configuration, IWebHostEnvironment hostingEnvironment) { - context.Services.AddStackExchangeRedisCache(options => - { - options.Configuration = configuration["Redis:Configuration"]; - }); - if (!hostingEnvironment.IsDevelopment()) { var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]); From 9f7775245df6dacf259122abac3b063043286472 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 24 Jun 2020 16:39:55 +0300 Subject: [PATCH 062/190] Use Volo.Abp.Caching.StackExchangeRedis from the module startup template. --- .../MyCompanyName.MyProjectName.HttpApi.Host.csproj | 2 +- .../MyProjectNameHttpApiHostModule.cs | 7 ++----- .../MyCompanyName.MyProjectName.IdentityServer.csproj | 2 +- .../MyProjectNameIdentityServerModule.cs | 7 ++----- .../MyCompanyName.MyProjectName.Web.Host.csproj | 2 +- .../MyProjectNameWebHostModule.cs | 7 ++----- 6 files changed, 9 insertions(+), 18 deletions(-) diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj index fa6dbaac96..e6147da9e3 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj @@ -14,10 +14,10 @@ - + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs index 14aee9bbfa..6d5bf1a7c8 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs @@ -22,6 +22,7 @@ using Volo.Abp.AspNetCore.Serilog; using Volo.Abp.AuditLogging.EntityFrameworkCore; using Volo.Abp.Autofac; using Volo.Abp.Caching; +using Volo.Abp.Caching.StackExchangeRedis; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.SqlServer; using Volo.Abp.Localization; @@ -40,6 +41,7 @@ namespace MyCompanyName.MyProjectName typeof(MyProjectNameHttpApiModule), typeof(AbpAspNetCoreMvcUiMultiTenancyModule), typeof(AbpAutofacModule), + typeof(AbpCachingStackExchangeRedisModule), typeof(AbpEntityFrameworkCoreSqlServerModule), typeof(AbpAuditLoggingEntityFrameworkCoreModule), typeof(AbpPermissionManagementEntityFrameworkCoreModule), @@ -114,11 +116,6 @@ namespace MyCompanyName.MyProjectName options.KeyPrefix = "MyProjectName:"; }); - context.Services.AddStackExchangeRedisCache(options => - { - options.Configuration = configuration["Redis:Configuration"]; - }); - if (!hostingEnvironment.IsDevelopment()) { var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj index 99ba329eb8..f5979f1512 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj @@ -12,7 +12,6 @@ - @@ -20,6 +19,7 @@ + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs index 41d31efc53..cfda73627d 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs @@ -23,6 +23,7 @@ using Volo.Abp.Auditing; using Volo.Abp.AuditLogging.EntityFrameworkCore; using Volo.Abp.Autofac; using Volo.Abp.Caching; +using Volo.Abp.Caching.StackExchangeRedis; using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.SqlServer; @@ -53,6 +54,7 @@ namespace MyCompanyName.MyProjectName typeof(AbpAspNetCoreMvcUiBasicThemeModule), typeof(AbpAuditLoggingEntityFrameworkCoreModule), typeof(AbpAutofacModule), + typeof(AbpCachingStackExchangeRedisModule), typeof(AbpEntityFrameworkCoreSqlServerModule), typeof(AbpIdentityEntityFrameworkCoreModule), typeof(AbpIdentityApplicationModule), @@ -133,11 +135,6 @@ namespace MyCompanyName.MyProjectName options.IsEnabled = MultiTenancyConsts.IsEnabled; }); - context.Services.AddStackExchangeRedisCache(options => - { - options.Configuration = configuration["Redis:Configuration"]; - }); - if (!hostingEnvironment.IsDevelopment()) { var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj index b2e1fd4783..87e5d62c11 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj @@ -14,10 +14,10 @@ - + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs index 7381787bc3..f2da06d4c2 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs @@ -25,6 +25,7 @@ using Volo.Abp.AspNetCore.Serilog; using Volo.Abp.Autofac; using Volo.Abp.AutoMapper; using Volo.Abp.Caching; +using Volo.Abp.Caching.StackExchangeRedis; using Volo.Abp.FeatureManagement; using Volo.Abp.Http.Client.IdentityModel.Web; using Volo.Abp.Identity; @@ -50,6 +51,7 @@ namespace MyCompanyName.MyProjectName typeof(AbpAspNetCoreMvcClientModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule), typeof(AbpAutofacModule), + typeof(AbpCachingStackExchangeRedisModule), typeof(AbpHttpClientIdentityModelWebModule), typeof(AbpIdentityWebModule), typeof(AbpIdentityHttpApiClientModule), @@ -202,11 +204,6 @@ namespace MyCompanyName.MyProjectName IConfiguration configuration, IWebHostEnvironment hostingEnvironment) { - context.Services.AddStackExchangeRedisCache(options => - { - options.Configuration = configuration["Redis:Configuration"]; - }); - if (!hostingEnvironment.IsDevelopment()) { var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]); From 8acf7b45f36751911695a8e96372b603f6e03328 Mon Sep 17 00:00:00 2001 From: Galip Tolga Erdem Date: Wed, 24 Jun 2020 18:13:27 +0300 Subject: [PATCH 063/190] removed jq from loggedOut.js --- .../Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml | 2 +- .../src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.js | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml index 3e3e9857a1..0e7b14236a 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.cshtml @@ -21,7 +21,7 @@ @L["LoggedOutText"] @if (Model.PostLogoutRedirectUri != null) { - @L["ReturnToText", Model.ClientName] + @L["ReturnToText", Model.ClientName] } @if (Model.SignOutIframeUrl != null) { diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.js b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.js index 6341b27ea7..950bf65719 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.js +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/LoggedOut.js @@ -1,6 +1,5 @@ -(function ($) { - //TODO:gterdem There should be an option to set the redirect delay here +document.addEventListener("DOMContentLoaded", function (event) { setTimeout(function () { - window.location = $('.redirectButton').attr('href'); + window.location = document.getElementById("redirectButton").getAttribute("href"); }, 3000) -})(JQuery) +}); From 49d7d6feb7e2be21e6322f4d37a372f65cc4902c Mon Sep 17 00:00:00 2001 From: Alper Ebicoglu Date: Wed, 24 Jun 2020 18:34:32 +0300 Subject: [PATCH 064/190] closes #2420 --- .../Volo/Abp/Cli/Commands/SuiteCommand.cs | 47 +++++++++++++++++-- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs index b4a4ff8bdd..fbe7fa675f 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs @@ -59,15 +59,33 @@ namespace Volo.Abp.Cli.Commands return; } - var result = CmdHelper.RunCmd("dotnet tool install " + SuitePackageName + " --add-source " + nugetIndexUrl + " -g"); + try + { + var result = CmdHelper.RunCmd("dotnet tool install " + SuitePackageName + " --add-source " + nugetIndexUrl + " -g"); - if (result == 0) + if (result == 0) + { + Logger.LogInformation("ABP Suite has been successfully installed."); + Logger.LogInformation("You can run it with the CLI command \"abp suite\""); + } + else + { + ShowSuiteManualInstallCommand(); + } + } + catch (Exception e) { - Logger.LogInformation("ABP Suite has been successfully installed."); - Logger.LogInformation("You can run it with the CLI command \"abp suite\""); + Logger.LogError("Couldn't install ABP Suite." + e.Message); + ShowSuiteManualInstallCommand(); } } + private void ShowSuiteManualInstallCommand() + { + Logger.LogInformation("You can also run the following command to install ABP Suite."); + Logger.LogInformation("dotnet tool install -g Volo.Abp.Suite"); + } + private async Task UpdateSuiteAsync() { var nugetIndexUrl = await _nuGetIndexUrlService.GetAsync(); @@ -77,7 +95,26 @@ namespace Volo.Abp.Cli.Commands return; } - CmdHelper.RunCmd("dotnet tool update " + SuitePackageName + " --add-source " + nugetIndexUrl + " -g"); + try + { + var result = CmdHelper.RunCmd("dotnet tool update " + SuitePackageName + " --add-source " + nugetIndexUrl + " -g"); + + if (result != 0) + { + ShowSuiteManualUpdateCommand(); + } + } + catch (Exception ex) + { + Logger.LogError("Couldn't update ABP Suite." + ex.Message); + ShowSuiteManualUpdateCommand(); + } + } + + private void ShowSuiteManualUpdateCommand() + { + Logger.LogError("You can also run the following command to update ABP Suite."); + Logger.LogError("dotnet tool update -g Volo.Abp.Suite"); } private static void RemoveSuite() From 8d3a145b7b8f9d029be74e3a32e1b4990a97907b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 24 Jun 2020 20:45:49 +0300 Subject: [PATCH 065/190] Resolved #4482 Add SetMany and GetMany to the IDistributedCache --- .../Volo/Abp/Caching/DistributedCache.cs | 393 ++++++++++++++++-- .../Caching/ICacheSupportsMultipleItems.cs | 30 ++ .../Volo/Abp/Caching/IDistributedCache.cs | 63 +++ .../Abp/Caching/DistributedCache_Tests.cs | 31 +- 4 files changed, 477 insertions(+), 40 deletions(-) create mode 100644 framework/src/Volo.Abp.Caching/Volo/Abp/Caching/ICacheSupportsMultipleItems.cs diff --git a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs index 267ab259f5..5bb1dd2481 100644 --- a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs +++ b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs @@ -1,6 +1,9 @@ using System; +using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks; +using JetBrains.Annotations; using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -28,16 +31,16 @@ namespace Volo.Abp.Caching IDistributedCacheSerializer serializer, IDistributedCacheKeyNormalizer keyNormalizer, IHybridServiceScopeFactory serviceScopeFactory) : base( - distributedCacheOption: distributedCacheOption, - cache: cache, - cancellationTokenProvider: cancellationTokenProvider, - serializer: serializer, - keyNormalizer: keyNormalizer, - serviceScopeFactory: serviceScopeFactory) + distributedCacheOption: distributedCacheOption, + cache: cache, + cancellationTokenProvider: cancellationTokenProvider, + serializer: serializer, + keyNormalizer: keyNormalizer, + serviceScopeFactory: serviceScopeFactory) { } - } + /// /// Represents a distributed cache of type. /// Uses a generic cache key type of type. @@ -148,19 +151,151 @@ namespace Volo.Abp.Caching { if (hideErrors == true) { - AsyncHelper.RunSync(() => HandleExceptionAsync(ex)); + HandleException(ex); return null; } throw; } - if (cachedBytes == null) + return ToCacheItem(cachedBytes); + } + + public virtual KeyValuePair[] GetMany( + IEnumerable keys, + bool? hideErrors = null) + { + var keyArray = keys.ToArray(); + + var cacheSupportsMultipleItems = Cache as ICacheSupportsMultipleItems; + if (cacheSupportsMultipleItems == null) { - return null; + return GetManyFallback( + keyArray, + hideErrors + ); } - return Serializer.Deserialize(cachedBytes); + hideErrors = hideErrors ?? _distributedCacheOption.HideErrors; + byte[][] cachedBytes; + + try + { + cachedBytes = cacheSupportsMultipleItems.GetMany(keyArray.Select(NormalizeKey)); + } + catch (Exception ex) + { + if (hideErrors == true) + { + HandleException(ex); + return ToCacheItemsWithDefaultValues(keyArray); + } + + throw; + } + + return ToCacheItems(cachedBytes, keyArray); + } + + protected virtual KeyValuePair[] GetManyFallback( + TCacheKey[] keys, + bool? hideErrors = null) + { + hideErrors = hideErrors ?? _distributedCacheOption.HideErrors; + + try + { + return keys + .Select(key => new KeyValuePair( + key, + Get(key, hideErrors: false) + ) + ).ToArray(); + } + catch (Exception ex) + { + if (hideErrors == true) + { + HandleException(ex); + return ToCacheItemsWithDefaultValues(keys); + } + + throw; + } + } + + public virtual async Task[]> GetManyAsync( + IEnumerable keys, + bool? hideErrors = null, + CancellationToken token = default) + { + var keyArray = keys.ToArray(); + + var cacheSupportsMultipleItems = Cache as ICacheSupportsMultipleItems; + if (cacheSupportsMultipleItems == null) + { + return await GetManyFallbackAsync( + keyArray, + hideErrors, + token + ); + } + + hideErrors = hideErrors ?? _distributedCacheOption.HideErrors; + byte[][] cachedBytes; + + try + { + cachedBytes = await cacheSupportsMultipleItems.GetManyAsync( + keyArray.Select(NormalizeKey), + CancellationTokenProvider.FallbackToProvider(token) + ); + } + catch (Exception ex) + { + if (hideErrors == true) + { + await HandleExceptionAsync(ex); + return ToCacheItemsWithDefaultValues(keyArray); + } + + throw; + } + + return ToCacheItems(cachedBytes, keyArray); + } + + protected virtual async Task[]> GetManyFallbackAsync( + TCacheKey[] keys, + bool? hideErrors = null, + CancellationToken token = default) + { + hideErrors = hideErrors ?? _distributedCacheOption.HideErrors; + + try + { + var result = new List>(); + + foreach (var key in keys) + { + result.Add(new KeyValuePair( + key, + await GetAsync(key, false, token)) + ); + } + + return result.ToArray(); + } + catch (Exception ex) + { + if (hideErrors == true) + { + await HandleExceptionAsync(ex); + return ToCacheItemsWithDefaultValues(keys); + } + + throw; + } } /// @@ -307,7 +442,7 @@ namespace Volo.Abp.Caching { if (hideErrors == true) { - AsyncHelper.RunSync(() => HandleExceptionAsync(ex)); + HandleException(ex); return; } @@ -354,14 +489,156 @@ namespace Volo.Abp.Caching } } - /// - /// Refreshes the cache value of the given key, and resets its sliding expiration timeout. - /// - /// The key of cached item to be retrieved from the cache. - /// Indicates to throw or hide the exceptions for the distributed cache. + public void SetMany( + IEnumerable> items, + DistributedCacheEntryOptions options = null, + bool? hideErrors = null) + { + var itemsArray = items.ToArray(); + + var cacheSupportsMultipleItems = Cache as ICacheSupportsMultipleItems; + if (cacheSupportsMultipleItems == null) + { + SetManyFallback( + itemsArray, + options, + hideErrors + ); + + return; + } + + hideErrors = hideErrors ?? _distributedCacheOption.HideErrors; + + try + { + cacheSupportsMultipleItems.SetMany( + ToRawCacheItems(itemsArray), + options ?? DefaultCacheOptions + ); + } + catch (Exception ex) + { + if (hideErrors == true) + { + HandleException(ex); + return; + } + + throw; + } + } + + protected virtual void SetManyFallback( + KeyValuePair[] items, + DistributedCacheEntryOptions options = null, + bool? hideErrors = null) + { + hideErrors = hideErrors ?? _distributedCacheOption.HideErrors; + + try + { + foreach (var item in items) + { + Set( + item.Key, + item.Value, + options: options, + hideErrors: false + ); + } + } + catch (Exception ex) + { + if (hideErrors == true) + { + HandleException(ex); + return; + } + + throw; + } + } + + public virtual async Task SetManyAsync( + IEnumerable> items, + DistributedCacheEntryOptions options = null, + bool? hideErrors = null, + CancellationToken token = default) + { + var itemsArray = items.ToArray(); + + var cacheSupportsMultipleItems = Cache as ICacheSupportsMultipleItems; + if (cacheSupportsMultipleItems == null) + { + await SetManyFallbackAsync( + itemsArray, + options, + hideErrors, + token + ); + + return; + } + + hideErrors = hideErrors ?? _distributedCacheOption.HideErrors; + + try + { + await cacheSupportsMultipleItems.SetManyAsync( + ToRawCacheItems(itemsArray), + options ?? DefaultCacheOptions, + CancellationTokenProvider.FallbackToProvider(token) + ); + } + catch (Exception ex) + { + if (hideErrors == true) + { + await HandleExceptionAsync(ex); + return; + } + + throw; + } + } + + protected virtual async Task SetManyFallbackAsync( + KeyValuePair[] items, + DistributedCacheEntryOptions options = null, + bool? hideErrors = null, + CancellationToken token = default) + { + hideErrors = hideErrors ?? _distributedCacheOption.HideErrors; + + try + { + foreach (var item in items) + { + await SetAsync( + item.Key, + item.Value, + options: options, + hideErrors: false, + token: token + ); + } + } + catch (Exception ex) + { + if (hideErrors == true) + { + await HandleExceptionAsync(ex); + return; + } + + throw; + } + } + public virtual void Refresh( TCacheKey key, bool? - hideErrors = null) + hideErrors = null) { hideErrors = hideErrors ?? _distributedCacheOption.HideErrors; @@ -373,20 +650,14 @@ namespace Volo.Abp.Caching { if (hideErrors == true) { - AsyncHelper.RunSync(() => HandleExceptionAsync(ex)); + HandleException(ex); return; } throw; } } - /// - /// Refreshes the cache value of the given key, and resets its sliding expiration timeout. - /// - /// The key of cached item to be retrieved from the cache. - /// Indicates to throw or hide the exceptions for the distributed cache. - /// The for the task. - /// The indicating that the operation is asynchronous. + public virtual async Task RefreshAsync( TCacheKey key, bool? hideErrors = null, @@ -410,11 +681,6 @@ namespace Volo.Abp.Caching } } - /// - /// Removes the cache item for given key from cache. - /// - /// The key of cached item to be retrieved from the cache. - /// Indicates to throw or hide the exceptions for the distributed cache. public virtual void Remove( TCacheKey key, bool? hideErrors = null) @@ -429,7 +695,7 @@ namespace Volo.Abp.Caching { if (hideErrors == true) { - AsyncHelper.RunSync(() => HandleExceptionAsync(ex)); + HandleException(ex); return; } @@ -437,13 +703,6 @@ namespace Volo.Abp.Caching } } - /// - /// Removes the cache item for given key from cache. - /// - /// The key of cached item to be retrieved from the cache. - /// Indicates to throw or hide the exceptions for the distributed cache. - /// The for the task. - /// The indicating that the operation is asynchronous. public virtual async Task RemoveAsync( TCacheKey key, bool? hideErrors = null, @@ -467,6 +726,11 @@ namespace Volo.Abp.Caching } } + protected virtual void HandleException(Exception ex) + { + AsyncHelper.RunSync(() => HandleExceptionAsync(ex)); + } + protected virtual async Task HandleExceptionAsync(Exception ex) { Logger.LogException(ex, LogLevel.Warning); @@ -478,5 +742,56 @@ namespace Volo.Abp.Caching .NotifyAsync(new ExceptionNotificationContext(ex, LogLevel.Warning)); } } + + protected virtual KeyValuePair[] ToCacheItems(byte[][] itemBytes, TCacheKey[] itemKeys) + { + if (itemBytes.Length != itemKeys.Length) + { + throw new AbpException("count of the item bytes should be same with the count of the given keys"); + } + + var result = new List>(); + + for (int i = 0; i < itemKeys.Length; i++) + { + result.Add( + new KeyValuePair( + itemKeys[i], + ToCacheItem(itemBytes[i]) + ) + ); + } + + return result.ToArray(); + } + + [CanBeNull] + protected virtual TCacheItem ToCacheItem([CanBeNull] byte[] bytes) + { + if (bytes == null) + { + return null; + } + + return Serializer.Deserialize(bytes); + } + + + protected virtual KeyValuePair[] ToRawCacheItems(KeyValuePair[] items) + { + return items + .Select(i => new KeyValuePair( + NormalizeKey(i.Key), + Serializer.Serialize(i.Value) + ) + ).ToArray(); + } + + private static KeyValuePair[] ToCacheItemsWithDefaultValues(TCacheKey[] keys) + { + return keys + .Select(key => new KeyValuePair(key, default)) + .ToArray(); + } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/ICacheSupportsMultipleItems.cs b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/ICacheSupportsMultipleItems.cs new file mode 100644 index 0000000000..af6f87021b --- /dev/null +++ b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/ICacheSupportsMultipleItems.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Caching.Distributed; + +namespace Volo.Abp.Caching +{ + public interface ICacheSupportsMultipleItems + { + byte[][] GetMany( + IEnumerable keys + ); + + Task GetManyAsync( + IEnumerable keys, + CancellationToken token = default + ); + + void SetMany( + IEnumerable> items, + DistributedCacheEntryOptions options + ); + + Task SetManyAsync( + IEnumerable> items, + DistributedCacheEntryOptions options, + CancellationToken token = default + ); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/IDistributedCache.cs b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/IDistributedCache.cs index 163da05632..80fe124785 100644 --- a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/IDistributedCache.cs +++ b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/IDistributedCache.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using JetBrains.Annotations; @@ -34,6 +35,39 @@ namespace Volo.Abp.Caching TCacheKey key, bool? hideErrors = null ); + + /// + /// Gets multiple cache items with the given keys. + /// + /// The returned list contains exactly the same count of items specified in the given keys. + /// An item in the return list can not be null, but an item in the list has null value + /// if the related key not found in the cache. + /// + /// The keys of cached items to be retrieved from the cache. + /// Indicates to throw or hide the exceptions for the distributed cache. + /// List of cache items. + KeyValuePair[] GetMany( + IEnumerable keys, + bool? hideErrors = null + ); + + /// + /// Gets multiple cache items with the given keys. + /// + /// The returned list contains exactly the same count of items specified in the given keys. + /// An item in the return list can not be null, but an item in the list has null value + /// if the related key not found in the cache. + /// + /// + /// The keys of cached items to be retrieved from the cache. + /// Indicates to throw or hide the exceptions for the distributed cache. + /// /// The for the task. + /// List of cache items. + Task[]> GetManyAsync( + IEnumerable keys, + bool? hideErrors = null, + CancellationToken token = default + ); /// /// Gets a cache item with the given key. If no cache item is found for the given key then returns null. @@ -113,6 +147,35 @@ namespace Volo.Abp.Caching CancellationToken token = default ); + /// + /// Sets multiple cache items. + /// Based on the implementation, this can be more efficient than setting multiple items individually. + /// + /// Items to set on the cache + /// The cache options for the value. + /// Indicates to throw or hide the exceptions for the distributed cache. + void SetMany( + IEnumerable> items, + DistributedCacheEntryOptions options = null, + bool? hideErrors = null + ); + + /// + /// Sets multiple cache items. + /// Based on the implementation, this can be more efficient than setting multiple items individually. + /// + /// Items to set on the cache + /// The cache options for the value. + /// Indicates to throw or hide the exceptions for the distributed cache. + /// The for the task. + /// The indicating that the operation is asynchronous. + Task SetManyAsync( + IEnumerable> items, + DistributedCacheEntryOptions options = null, + bool? hideErrors = null, + CancellationToken token = default + ); + /// /// Refreshes the cache value of the given key, and resets its sliding expiration timeout. /// diff --git a/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/DistributedCache_Tests.cs b/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/DistributedCache_Tests.cs index 14677a73bd..533362c851 100644 --- a/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/DistributedCache_Tests.cs +++ b/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/DistributedCache_Tests.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Threading.Tasks; using Shouldly; using Volo.Abp.Testing; @@ -80,7 +81,6 @@ namespace Volo.Abp.Caching var personCache = GetRequiredService>(); var otherPersonCache = GetRequiredService>(); - var cacheKey = Guid.NewGuid().ToString(); const string personName = "john nash"; @@ -310,5 +310,34 @@ namespace Volo.Abp.Caching cacheItem2.ShouldBeNull(); } + [Fact] + public async Task Should_Set_And_Get_Multiple_Items_Async() + { + var personCache = GetRequiredService>(); + + await personCache.SetManyAsync(new[] + { + new KeyValuePair("john", new PersonCacheItem("John Nash")), + new KeyValuePair("thomas", new PersonCacheItem("Thomas Moore")) + }); + + var cacheItems = await personCache.GetManyAsync(new[] + { + "john", + "thomas", + "baris" //doesn't exist + }); + + cacheItems.Length.ShouldBe(3); + cacheItems[0].Key.ShouldBe("john"); + cacheItems[0].Value.Name.ShouldBe("John Nash"); + cacheItems[1].Key.ShouldBe("thomas"); + cacheItems[1].Value.Name.ShouldBe("Thomas Moore"); + cacheItems[2].Key.ShouldBe("baris"); + cacheItems[2].Value.ShouldBeNull(); + + (await personCache.GetAsync("john")).Name.ShouldBe("John Nash"); + (await personCache.GetAsync("baris")).ShouldBeNull(); + } } } \ No newline at end of file From 861443211a211df5ee315b1bbb74307090fe7bdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 24 Jun 2020 21:07:28 +0300 Subject: [PATCH 066/190] Resolved #2437: Optimize getting permissions. --- .../Abp/PermissionManagement/PermissionStore.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs index bd8fe7abc2..e5438846eb 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; @@ -74,13 +75,15 @@ namespace Volo.Abp.PermissionManagement Logger.LogDebug($"Setting the cache items. Count: {permissions.Count}"); + var cacheItems = new List>(); + foreach (var permission in permissions) { var isGranted = permissionGrants.Any(pg => pg.Name == permission.Name); //TODO: Optimize? Dictionary/Hash - - await Cache.SetAsync( + + cacheItems.Add(new KeyValuePair( CalculateCacheKey(permission.Name, providerName, providerKey), - new PermissionGrantCacheItem(permission.Name, isGranted) + new PermissionGrantCacheItem(permission.Name, isGranted)) ); if (permission.Name == currentName) @@ -88,6 +91,8 @@ namespace Volo.Abp.PermissionManagement currentCacheItem.IsGranted = isGranted; } } + + await Cache.SetManyAsync(cacheItems); Logger.LogDebug($"Finished setting the cache items. Count: {permissions.Count}"); } From fd321dde8c5b63661bfbe03ce8373da3d6689d44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 24 Jun 2020 21:28:48 +0300 Subject: [PATCH 067/190] Remove Name from PermissionGrantCacheItem. Also use hashset for a better performance. --- .../PermissionManagement/PermissionGrantCacheItem.cs | 5 +---- .../Volo/Abp/PermissionManagement/PermissionStore.cs | 12 +++++++----- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGrantCacheItem.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGrantCacheItem.cs index e4d3f1648e..49013954a2 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGrantCacheItem.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGrantCacheItem.cs @@ -5,8 +5,6 @@ namespace Volo.Abp.PermissionManagement [Serializable] public class PermissionGrantCacheItem { - public string Name { get; set; } //TODO: Consider to remove this - public bool IsGranted { get; set; } public PermissionGrantCacheItem() @@ -14,9 +12,8 @@ namespace Volo.Abp.PermissionManagement } - public PermissionGrantCacheItem(string name, bool isGranted) + public PermissionGrantCacheItem(bool isGranted) { - Name = name; IsGranted = isGranted; } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs index e5438846eb..bdfdc38881 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionStore.cs @@ -54,7 +54,7 @@ namespace Volo.Abp.PermissionManagement Logger.LogDebug($"Not found in the cache: {cacheKey}"); - cacheItem = new PermissionGrantCacheItem(name, false); + cacheItem = new PermissionGrantCacheItem(false); await SetCacheItemsAsync(providerName, providerKey, name, cacheItem); @@ -71,19 +71,21 @@ namespace Volo.Abp.PermissionManagement Logger.LogDebug($"Getting all granted permissions from the repository for this provider name,key: {providerName},{providerKey}"); - var permissionGrants = await PermissionGrantRepository.GetListAsync(providerName, providerKey); + var grantedPermissionsHashSet = new HashSet( + (await PermissionGrantRepository.GetListAsync(providerName, providerKey)).Select(p => p.Name) + ); Logger.LogDebug($"Setting the cache items. Count: {permissions.Count}"); var cacheItems = new List>(); - + foreach (var permission in permissions) { - var isGranted = permissionGrants.Any(pg => pg.Name == permission.Name); //TODO: Optimize? Dictionary/Hash + var isGranted = grantedPermissionsHashSet.Contains(permission.Name); cacheItems.Add(new KeyValuePair( CalculateCacheKey(permission.Name, providerName, providerKey), - new PermissionGrantCacheItem(permission.Name, isGranted)) + new PermissionGrantCacheItem(isGranted)) ); if (permission.Name == currentName) From 177cd6e3319f740dd909a2832e8ef8c71bd6668e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 24 Jun 2020 21:29:46 +0300 Subject: [PATCH 068/190] Resolved #4487: Optimize getting settings. --- .../SettingManagementStore.cs | 49 +++++++++++++++---- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManagementStore.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManagementStore.cs index d7a8b0ccb1..617d360898 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManagementStore.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManagementStore.cs @@ -11,23 +11,25 @@ namespace Volo.Abp.SettingManagement public class SettingManagementStore : ISettingManagementStore, ITransientDependency { protected IDistributedCache Cache { get; } + protected ISettingDefinitionManager SettingDefinitionManager { get; } protected ISettingRepository SettingRepository { get; } protected IGuidGenerator GuidGenerator { get; } public SettingManagementStore( ISettingRepository settingRepository, IGuidGenerator guidGenerator, - IDistributedCache cache) + IDistributedCache cache, + ISettingDefinitionManager settingDefinitionManager) { SettingRepository = settingRepository; GuidGenerator = guidGenerator; Cache = cache; + SettingDefinitionManager = settingDefinitionManager; } public virtual async Task GetOrNullAsync(string name, string providerName, string providerKey) { - var cacheItem = await GetCacheItemAsync(name, providerName, providerKey); - return cacheItem.Value; + return (await GetCacheItemAsync(name, providerName, providerKey)).Value; } public virtual async Task SetAsync(string name, string value, string providerName, string providerKey) @@ -70,16 +72,43 @@ namespace Volo.Abp.SettingManagement return cacheItem; } - var setting = await SettingRepository.FindAsync(name, providerName, providerKey); + cacheItem = new SettingCacheItem(null); + + await SetCacheItemsAsync(providerName, providerKey, name, cacheItem); + + return cacheItem; + } - cacheItem = new SettingCacheItem(setting?.Value); + private async Task SetCacheItemsAsync( + string providerName, + string providerKey, + string currentName, + SettingCacheItem currentCacheItem) + { + var settingDefinitions = SettingDefinitionManager.GetAll(); + var settingsDictionary = (await SettingRepository.GetListAsync(providerName, providerKey)) + .ToDictionary(s => s.Name, s => s.Value); + + var cacheItems = new List>(); + + foreach (var settingDefinition in settingDefinitions) + { + var settingValue = settingsDictionary.GetOrDefault(settingDefinition.Name); + + cacheItems.Add( + new KeyValuePair( + CalculateCacheKey(settingDefinition.Name, providerName, providerKey), + new SettingCacheItem(settingValue) + ) + ); - await Cache.SetAsync( - cacheKey, - cacheItem - ); + if (settingDefinition.Name == currentName) + { + currentCacheItem.Value = settingValue; + } + } - return cacheItem; + await Cache.SetManyAsync(cacheItems); } protected virtual string CalculateCacheKey(string name, string providerName, string providerKey) From a7a928fd3214602a5fdbb0e0fa7a02d3eb59145f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 24 Jun 2020 21:37:43 +0300 Subject: [PATCH 069/190] Resolved #4491: Optimize getting features. --- .../FeatureManagementStore.cs | 51 +++++++++++++++---- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManagementStore.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManagementStore.cs index b35225edb2..26388fdaf9 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManagementStore.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManagementStore.cs @@ -1,6 +1,9 @@ -using System.Threading.Tasks; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; using Volo.Abp.Caching; using Volo.Abp.DependencyInjection; +using Volo.Abp.Features; using Volo.Abp.Guids; namespace Volo.Abp.FeatureManagement @@ -8,17 +11,20 @@ namespace Volo.Abp.FeatureManagement public class FeatureManagementStore : IFeatureManagementStore, ITransientDependency { protected IDistributedCache Cache { get; } + protected IFeatureDefinitionManager FeatureDefinitionManager { get; } protected IFeatureValueRepository FeatureValueRepository { get; } protected IGuidGenerator GuidGenerator { get; } public FeatureManagementStore( IFeatureValueRepository featureValueRepository, IGuidGenerator guidGenerator, - IDistributedCache cache) + IDistributedCache cache, + IFeatureDefinitionManager featureDefinitionManager) { FeatureValueRepository = featureValueRepository; GuidGenerator = guidGenerator; Cache = cache; + FeatureDefinitionManager = featureDefinitionManager; } public virtual async Task GetOrNullAsync(string name, string providerName, string providerKey) @@ -61,16 +67,43 @@ namespace Volo.Abp.FeatureManagement return cacheItem; } - var featureValue = await FeatureValueRepository.FindAsync(name, providerName, providerKey); + cacheItem = new FeatureValueCacheItem(null); + + await SetCacheItemsAsync(providerName, providerKey, name, cacheItem); - cacheItem = new FeatureValueCacheItem(featureValue?.Value); + return cacheItem; + } + + private async Task SetCacheItemsAsync( + string providerName, + string providerKey, + string currentName, + FeatureValueCacheItem currentCacheItem) + { + var featureDefinitions = FeatureDefinitionManager.GetAll(); + var featuresDictionary = (await FeatureValueRepository.GetListAsync(providerName, providerKey)) + .ToDictionary(s => s.Name, s => s.Value); + + var cacheItems = new List>(); + + foreach (var featureDefinition in featureDefinitions) + { + var featureValue = featuresDictionary.GetOrDefault(featureDefinition.Name); + + cacheItems.Add( + new KeyValuePair( + CalculateCacheKey(featureDefinition.Name, providerName, providerKey), + new FeatureValueCacheItem(featureValue) + ) + ); - await Cache.SetAsync( - cacheKey, - cacheItem - ); + if (featureDefinition.Name == currentName) + { + currentCacheItem.Value = featureValue; + } + } - return cacheItem; + await Cache.SetManyAsync(cacheItems); } protected virtual string CalculateCacheKey(string name, string providerName, string providerKey) From d8a8d0f1e45548341093d2014f386076e8da6c49 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Thu, 25 Jun 2020 10:03:30 +0300 Subject: [PATCH 070/190] fix Cli Switch-to-preview resolves https://github.com/abpframework/abp/issues/4391 --- .../ProjectModification/NpmPackagesUpdater.cs | 45 +++++++++++-------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs index 02ae0040bc..752adad54e 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs @@ -54,11 +54,12 @@ namespace Volo.Abp.Cli.ProjectModification _npmGlobalPackagesChecker.Check(); var packagesUpdated = new ConcurrentDictionary(); + async Task UpdateAsync(string file) { var updated = await UpdatePackagesInFile(file, includePreviews, switchToStable); packagesUpdated.TryAdd(file, updated); - }; + } Task.WaitAll(fileList.Select(UpdateAsync).ToArray()); @@ -66,23 +67,20 @@ namespace Volo.Abp.Cli.ProjectModification { var fileDirectory = Path.GetDirectoryName(file.Key).EnsureEndsWith(Path.DirectorySeparatorChar); - if (IsAngularProject(fileDirectory)) + if (includePreviews) { - if (includePreviews) - { - await CreateNpmrcFileAsync(Path.GetDirectoryName(file.Key)); - } - else if (switchToStable) - { - await DeleteNpmrcFileAsync(Path.GetDirectoryName(file.Key)); - } + await CreateNpmrcFileAsync(Path.GetDirectoryName(file.Key)); + RunNpmInstall(fileDirectory); + } + else if (switchToStable) + { + await DeleteNpmrcFileAsync(Path.GetDirectoryName(file.Key)); + RunYarn(fileDirectory); } - - RunYarn(fileDirectory); if (!IsAngularProject(fileDirectory)) { - Thread.Sleep(500); + Thread.Sleep(1000); RunGulp(fileDirectory); } } @@ -166,7 +164,8 @@ namespace Volo.Abp.Cli.ProjectModification return File.Exists(Path.Combine(fileDirectory, "angular.json")); } - protected virtual async Task UpdatePackagesInFile(string filePath, bool includePreviews = false, bool switchToStable = false) + protected virtual async Task UpdatePackagesInFile(string filePath, bool includePreviews = false, + bool switchToStable = false) { var packagesUpdated = false; var fileContent = File.ReadAllText(filePath); @@ -201,7 +200,7 @@ namespace Volo.Abp.Cli.ProjectModification bool includePreviews = false, bool switchToStable = false) { - var currentVersion = (string)package.Value; + var currentVersion = (string) package.Value; var version = await GetLatestVersion(package, currentVersion, includePreviews, switchToStable); @@ -214,7 +213,8 @@ namespace Volo.Abp.Cli.ProjectModification package.Value.Replace(versionWithPrefix); - Logger.LogInformation($"Updated {package.Name} to {version} in {filePath.Replace(Directory.GetCurrentDirectory(), "")}."); + Logger.LogInformation( + $"Updated {package.Name} to {version} in {filePath.Replace(Directory.GetCurrentDirectory(), "")}."); return true; } @@ -256,12 +256,12 @@ namespace Volo.Abp.Cli.ProjectModification protected virtual List GetAbpPackagesFromPackageJson(JObject fileObject) { - var dependencyList = new[] { "dependencies", "devDependencies", "peerDependencies" }; + var dependencyList = new[] {"dependencies", "devDependencies", "peerDependencies"}; var abpPackages = new List(); foreach (var dependencyListName in dependencyList) { - var dependencies = (JObject)fileObject[dependencyListName]; + var dependencies = (JObject) fileObject[dependencyListName]; if (dependencies == null) { @@ -269,7 +269,8 @@ namespace Volo.Abp.Cli.ProjectModification } var properties = dependencies.Properties().ToList(); - abpPackages.AddRange(properties.Where(p => p.Name.StartsWith("@abp/") || p.Name.StartsWith("@volo/")).ToList()); + abpPackages.AddRange(properties.Where(p => p.Name.StartsWith("@abp/") || p.Name.StartsWith("@volo/")) + .ToList()); } return abpPackages; @@ -286,5 +287,11 @@ namespace Volo.Abp.Cli.ProjectModification Logger.LogInformation($"Running Yarn on {fileDirectory}"); CmdHelper.RunCmd($"cd {fileDirectory} && yarn"); } + + protected virtual void RunNpmInstall(string fileDirectory) + { + Logger.LogInformation($"Running npm install on {fileDirectory}"); + CmdHelper.RunCmd($"cd {fileDirectory} && npm install"); + } } } From 255033d60555957a4de604375f3aa2bec59fc2e4 Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Thu, 25 Jun 2020 15:04:24 +0800 Subject: [PATCH 071/190] Remove unnecessary launchSettings.json file. Resolve #4465 --- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 27 ------------------- ...o.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj | 2 -- ...AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj | 2 -- .../Properties/launchSettings.json | 27 ------------------- ....Abp.AspNetCore.Mvc.UI.Theme.Shared.csproj | 2 -- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 7 ----- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 27 ------------------- ...Volo.Abp.Account.Web.IdentityServer.csproj | 2 -- .../Properties/launchSettings.json | 27 ------------------- .../Volo.Abp.Account.Web.csproj | 2 -- .../Properties/launchSettings.json | 27 ------------------- .../Volo.Blogging.Admin.Web.csproj | 1 - .../Properties/launchSettings.json | 27 ------------------- .../Volo.Blogging.Web.csproj | 2 -- .../Properties/launchSettings.json | 27 ------------------- .../Volo.ClientSimulation.Web.csproj | 2 -- .../Properties/launchSettings.json | 27 ------------------- .../Volo.Docs.Admin.Web.csproj | 2 -- .../Properties/launchSettings.json | 27 ------------------- .../src/Volo.Docs.Web/Volo.Docs.Web.csproj | 2 -- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 27 ------------------- .../Volo.Abp.Identity.Web.csproj | 2 -- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 27 ------------------- .../Volo.Abp.SettingManagement.Web.csproj | 2 -- .../Properties/launchSettings.json | 27 ------------------- .../Volo.Abp.TenantManagement.Web.csproj | 2 -- .../Volo.Abp.VirtualFileExplorer.Web.csproj | 5 ---- .../ProductManagement.Web.csproj | 2 -- .../Properties/launchSettings.json | 27 ------------------- .../MyCompanyName.MyProjectName.Web.csproj | 5 ---- .../Properties/launchSettings.json | 27 ------------------- 53 files changed, 1016 deletions(-) delete mode 100644 framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Properties/launchSettings.json delete mode 100644 framework/src/Volo.Abp.AspNetCore.MultiTenancy/Properties/launchSettings.json delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.Client/Properties/launchSettings.json delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Properties/launchSettings.json delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Properties/launchSettings.json delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Properties/launchSettings.json delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Properties/launchSettings.json delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Properties/launchSettings.json delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Properties/launchSettings.json delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Properties/launchSettings.json delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI/Properties/launchSettings.json delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Properties/launchSettings.json delete mode 100644 framework/src/Volo.Abp.AspNetCore.Serilog/Properties/launchSettings.json delete mode 100644 framework/src/Volo.Abp.AspNetCore.SignalR/Properties/launchSettings.json delete mode 100644 framework/src/Volo.Abp.AspNetCore.TestBase/Properties/launchSettings.json delete mode 100644 framework/src/Volo.Abp.AspNetCore/Properties/launchSettings.json delete mode 100644 framework/src/Volo.Abp.Cli/Properties/launchSettings.json delete mode 100644 framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Properties/launchSettings.json delete mode 100644 framework/src/Volo.Abp.Http.Client.IdentityModel/Properties/launchSettings.json delete mode 100644 framework/src/Volo.Abp.Http.Client/Properties/launchSettings.json delete mode 100644 modules/account/src/Volo.Abp.Account.Web.IdentityServer/Properties/launchSettings.json delete mode 100644 modules/account/src/Volo.Abp.Account.Web/Properties/launchSettings.json delete mode 100644 modules/blogging/src/Volo.Blogging.Admin.Web/Properties/launchSettings.json delete mode 100644 modules/blogging/src/Volo.Blogging.Web/Properties/launchSettings.json delete mode 100644 modules/client-simulation/src/Volo.ClientSimulation.Web/Properties/launchSettings.json delete mode 100644 modules/docs/src/Volo.Docs.Admin.Web/Properties/launchSettings.json delete mode 100644 modules/docs/src/Volo.Docs.Web/Properties/launchSettings.json delete mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Properties/launchSettings.json delete mode 100644 modules/identity/src/Volo.Abp.Identity.AspNetCore/Properties/launchSettings.json delete mode 100644 modules/identity/src/Volo.Abp.Identity.HttpApi.Client/Properties/launchSettings.json delete mode 100644 modules/identity/src/Volo.Abp.Identity.HttpApi/Properties/launchSettings.json delete mode 100644 modules/identity/src/Volo.Abp.Identity.Web/Properties/launchSettings.json delete mode 100644 modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Properties/launchSettings.json delete mode 100644 modules/setting-management/src/Volo.Abp.SettingManagement.Web/Properties/launchSettings.json delete mode 100644 modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Properties/launchSettings.json delete mode 100644 samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/Properties/launchSettings.json delete mode 100644 templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Properties/launchSettings.json diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Properties/launchSettings.json deleted file mode 100644 index fcbf86698d..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:53450/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.AspNetCore.Authentication.OAuth": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:53451/" - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Properties/launchSettings.json deleted file mode 100644 index 67c494aa28..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:53760/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.AspNetCore.MultiTenancy": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:53763/" - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Properties/launchSettings.json deleted file mode 100644 index e17b14d87f..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:52302/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.AspNetCore.Mvc.Client": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:52303/" - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Properties/launchSettings.json deleted file mode 100644 index c2dcf8fae6..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:61183/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.AspNetCore.Mvc.UI.Bootstrap": { - "commandName": "Project", - "launchBrowser": true, - "launchUrl": "http://localhost:5000", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Properties/launchSettings.json deleted file mode 100644 index 7bcd0a8aff..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:53762/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.AspNetCore.Mvc.UI.Bundling": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:53765/" - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Properties/launchSettings.json deleted file mode 100644 index 6870af4120..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:56918/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.AspNetCore.Mvc.UI.TenantSwitch": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:56919/" - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Properties/launchSettings.json deleted file mode 100644 index 4ae9c1d2f1..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:53766/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.AspNetCore.Mvc.UI.Packages": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:53768/" - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Properties/launchSettings.json deleted file mode 100644 index 763367a2a8..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:50398/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:50399/" - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj index c390cfe58c..206224f918 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj @@ -22,8 +22,6 @@ - - diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj index 078563ace3..8c098c3300 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj @@ -18,8 +18,6 @@ - - diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Properties/launchSettings.json deleted file mode 100644 index f928a8ea06..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:51544/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:51545/" - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.csproj index 71e1257a4d..4b0fbc24cf 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.csproj @@ -23,9 +23,7 @@ - - diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Properties/launchSettings.json deleted file mode 100644 index e9779c3c37..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:53761/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.AspNetCore.Mvc.UI.Widgets": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:53764/" - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Properties/launchSettings.json deleted file mode 100644 index 3b3fd9ea46..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:55913/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.AspNetCore.Mvc.UI": { - "commandName": "Project", - "launchBrowser": true, - "launchUrl": "http://localhost:5000", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.Mvc/Properties/launchSettings.json deleted file mode 100644 index 3c84fd21f2..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:53767/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.AspNetCore.Mvc": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:53769/" - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Serilog/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.Serilog/Properties/launchSettings.json deleted file mode 100644 index cb1bd6546c..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Serilog/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:61851/", - "sslPort": 44301 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.AspNetCore.Serilog": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "https://localhost:5001;http://localhost:5000" - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.SignalR/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.SignalR/Properties/launchSettings.json deleted file mode 100644 index 418c7f2621..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.SignalR/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:53900/", - "sslPort": 44362 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.SignalR": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "https://localhost:5001;http://localhost:5000" - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.TestBase/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.TestBase/Properties/launchSettings.json deleted file mode 100644 index fca5708e7b..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.TestBase/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:53783/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.AspNetCore.TestBase": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:53784/" - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore/Properties/launchSettings.json deleted file mode 100644 index 4098e788cd..0000000000 --- a/framework/src/Volo.Abp.AspNetCore/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:53374/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.AspNetCore": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:53375/" - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli/Properties/launchSettings.json b/framework/src/Volo.Abp.Cli/Properties/launchSettings.json deleted file mode 100644 index e7f99eea04..0000000000 --- a/framework/src/Volo.Abp.Cli/Properties/launchSettings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "profiles": { - "Volo.Abp.Cli": { - "commandName": "Project" - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Properties/launchSettings.json b/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Properties/launchSettings.json deleted file mode 100644 index d56e5c65b7..0000000000 --- a/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:52306/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.Http.Client.IdentityModel": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:52307/" - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Http.Client.IdentityModel/Properties/launchSettings.json b/framework/src/Volo.Abp.Http.Client.IdentityModel/Properties/launchSettings.json deleted file mode 100644 index d56e5c65b7..0000000000 --- a/framework/src/Volo.Abp.Http.Client.IdentityModel/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:52306/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.Http.Client.IdentityModel": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:52307/" - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Http.Client/Properties/launchSettings.json b/framework/src/Volo.Abp.Http.Client/Properties/launchSettings.json deleted file mode 100644 index 3cef3cf668..0000000000 --- a/framework/src/Volo.Abp.Http.Client/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:52208/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.Http.Client": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:52209/" - } - } -} \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Properties/launchSettings.json b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Properties/launchSettings.json deleted file mode 100644 index aca3a5b165..0000000000 --- a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:49583/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.Account.Web.IdentityServer": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:49584/" - } - } -} \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.csproj b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.csproj index 17a164e612..ca27f60695 100644 --- a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.csproj +++ b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.csproj @@ -21,8 +21,6 @@ - - diff --git a/modules/account/src/Volo.Abp.Account.Web/Properties/launchSettings.json b/modules/account/src/Volo.Abp.Account.Web/Properties/launchSettings.json deleted file mode 100644 index 8dab775bff..0000000000 --- a/modules/account/src/Volo.Abp.Account.Web/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:56009/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.Account.Web": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:56013/" - } - } -} \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.csproj b/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.csproj index a77cbad333..42918e34d4 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.csproj +++ b/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.csproj @@ -25,8 +25,6 @@ - - diff --git a/modules/blogging/src/Volo.Blogging.Admin.Web/Properties/launchSettings.json b/modules/blogging/src/Volo.Blogging.Admin.Web/Properties/launchSettings.json deleted file mode 100644 index 64a5fd912c..0000000000 --- a/modules/blogging/src/Volo.Blogging.Admin.Web/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:50000/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Blogging.Web": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:50014/" - } - } -} \ No newline at end of file diff --git a/modules/blogging/src/Volo.Blogging.Admin.Web/Volo.Blogging.Admin.Web.csproj b/modules/blogging/src/Volo.Blogging.Admin.Web/Volo.Blogging.Admin.Web.csproj index 9037420f3f..fdbe0dd150 100644 --- a/modules/blogging/src/Volo.Blogging.Admin.Web/Volo.Blogging.Admin.Web.csproj +++ b/modules/blogging/src/Volo.Blogging.Admin.Web/Volo.Blogging.Admin.Web.csproj @@ -28,7 +28,6 @@ - diff --git a/modules/blogging/src/Volo.Blogging.Web/Properties/launchSettings.json b/modules/blogging/src/Volo.Blogging.Web/Properties/launchSettings.json deleted file mode 100644 index 64a5fd912c..0000000000 --- a/modules/blogging/src/Volo.Blogging.Web/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:50000/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Blogging.Web": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:50014/" - } - } -} \ No newline at end of file diff --git a/modules/blogging/src/Volo.Blogging.Web/Volo.Blogging.Web.csproj b/modules/blogging/src/Volo.Blogging.Web/Volo.Blogging.Web.csproj index e26b58d550..203c142de9 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Volo.Blogging.Web.csproj +++ b/modules/blogging/src/Volo.Blogging.Web/Volo.Blogging.Web.csproj @@ -28,9 +28,7 @@ - - diff --git a/modules/client-simulation/src/Volo.ClientSimulation.Web/Properties/launchSettings.json b/modules/client-simulation/src/Volo.ClientSimulation.Web/Properties/launchSettings.json deleted file mode 100644 index 2f043da627..0000000000 --- a/modules/client-simulation/src/Volo.ClientSimulation.Web/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:51023/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.ClientSimulation.Web": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:51024/" - } - } -} \ No newline at end of file diff --git a/modules/client-simulation/src/Volo.ClientSimulation.Web/Volo.ClientSimulation.Web.csproj b/modules/client-simulation/src/Volo.ClientSimulation.Web/Volo.ClientSimulation.Web.csproj index e8358805b7..aa3ecf2dac 100644 --- a/modules/client-simulation/src/Volo.ClientSimulation.Web/Volo.ClientSimulation.Web.csproj +++ b/modules/client-simulation/src/Volo.ClientSimulation.Web/Volo.ClientSimulation.Web.csproj @@ -27,9 +27,7 @@ - - diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Properties/launchSettings.json b/modules/docs/src/Volo.Docs.Admin.Web/Properties/launchSettings.json deleted file mode 100644 index b0ed7371d0..0000000000 --- a/modules/docs/src/Volo.Docs.Admin.Web/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:51397", - "sslPort": 44346 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Docs.Admin.Web": { - "commandName": "Project", - "launchBrowser": true, - "applicationUrl": "https://localhost:5001;http://localhost:5000", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Volo.Docs.Admin.Web.csproj b/modules/docs/src/Volo.Docs.Admin.Web/Volo.Docs.Admin.Web.csproj index 164c28cdb2..5b75a24f41 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Volo.Docs.Admin.Web.csproj +++ b/modules/docs/src/Volo.Docs.Admin.Web/Volo.Docs.Admin.Web.csproj @@ -30,11 +30,9 @@ - - diff --git a/modules/docs/src/Volo.Docs.Web/Properties/launchSettings.json b/modules/docs/src/Volo.Docs.Web/Properties/launchSettings.json deleted file mode 100644 index e32f163034..0000000000 --- a/modules/docs/src/Volo.Docs.Web/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:55007/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Docs.Web": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:55020/" - } - } -} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.csproj b/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.csproj index 9afc79d796..4479ec40af 100644 --- a/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.csproj +++ b/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.csproj @@ -33,11 +33,9 @@ - - diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Properties/launchSettings.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Properties/launchSettings.json deleted file mode 100644 index 23a4efbb61..0000000000 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:56993/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Abp.FeatureManagement.Web": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:56994/" - } - } -} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Properties/launchSettings.json b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Properties/launchSettings.json deleted file mode 100644 index fc5b1a72f7..0000000000 --- a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:53901/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.Identity.AspNetCore": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:53902/" - } - } -} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.HttpApi.Client/Properties/launchSettings.json b/modules/identity/src/Volo.Abp.Identity.HttpApi.Client/Properties/launchSettings.json deleted file mode 100644 index 6ba85345ab..0000000000 --- a/modules/identity/src/Volo.Abp.Identity.HttpApi.Client/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:53978/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.Identity.HttpApi.Client": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:53980/" - } - } -} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.HttpApi/Properties/launchSettings.json b/modules/identity/src/Volo.Abp.Identity.HttpApi/Properties/launchSettings.json deleted file mode 100644 index 2323768a18..0000000000 --- a/modules/identity/src/Volo.Abp.Identity.HttpApi/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:53977/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.Identity.HttpApi": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:53979/" - } - } -} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Properties/launchSettings.json b/modules/identity/src/Volo.Abp.Identity.Web/Properties/launchSettings.json deleted file mode 100644 index 9a8b023b55..0000000000 --- a/modules/identity/src/Volo.Abp.Identity.Web/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:55588/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.Identity.Web": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:55590/" - } - } -} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.csproj b/modules/identity/src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.csproj index f5c9ffc3d4..5a8367dc5f 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.csproj +++ b/modules/identity/src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.csproj @@ -25,9 +25,7 @@ - - diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Properties/launchSettings.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Properties/launchSettings.json deleted file mode 100644 index 6cb3381b6c..0000000000 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:55926/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.PermissionManagement.Web": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:55927/" - } - } -} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Properties/launchSettings.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Properties/launchSettings.json deleted file mode 100644 index 844334b642..0000000000 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:62272/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.SettingManagement.Web": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:62273/" - } - } -} \ No newline at end of file diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj index b37ef515df..a0197c0686 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj @@ -24,8 +24,6 @@ - - diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Properties/launchSettings.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Properties/launchSettings.json deleted file mode 100644 index dab1d2b972..0000000000 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:55673/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.TenantManagement.Web": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:55676/" - } - } -} \ No newline at end of file diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj index c558ea9637..71ec4cc04a 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj @@ -19,9 +19,7 @@ - - diff --git a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.csproj b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.csproj index 6cbf49a69c..b2f5d2a4a8 100644 --- a/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.csproj +++ b/modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Volo.Abp.VirtualFileExplorer.Web.csproj @@ -30,9 +30,4 @@ - - - - - diff --git a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/ProductManagement.Web.csproj b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/ProductManagement.Web.csproj index 6ef492c829..15987e5f65 100644 --- a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/ProductManagement.Web.csproj +++ b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/ProductManagement.Web.csproj @@ -15,8 +15,6 @@ - - diff --git a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/Properties/launchSettings.json b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/Properties/launchSettings.json deleted file mode 100644 index 5ca72943eb..0000000000 --- a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:56993/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "ProductManagement.Web": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:56994/" - } - } -} \ No newline at end of file diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj index 2fa8cee028..d02d094f43 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj @@ -28,11 +28,6 @@ - - - - - diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Properties/launchSettings.json b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Properties/launchSettings.json deleted file mode 100644 index c261ea344a..0000000000 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:56993/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "MyCompanyName.MyProjectName.Web": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:56994/" - } - } -} \ No newline at end of file From 158f86a3610ef4329e1e58e251668ac1a0855dd1 Mon Sep 17 00:00:00 2001 From: Ismail Yilmaz Date: Thu, 25 Jun 2020 10:47:06 +0300 Subject: [PATCH 072/190] AddGlobalFilters method made virtual --- .../Domain/Repositories/MongoDB/MongoDbRepositoryFilterer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepositoryFilterer.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepositoryFilterer.cs index e75b86aca5..4c07c747f3 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepositoryFilterer.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepositoryFilterer.cs @@ -19,7 +19,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB CurrentTenant = currentTenant; } - public void AddGlobalFilters(List> filters) + public virtual void AddGlobalFilters(List> filters) { if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)) && DataFilter.IsEnabled()) { From a84e31143c696c39c9e894bcc83fcb4e78274a8f Mon Sep 17 00:00:00 2001 From: Necati Meral Date: Thu, 25 Jun 2020 10:09:59 +0200 Subject: [PATCH 073/190] Optimized repositories in readonly application services --- .../Abp/Application/Services/AbstractKeyCrudAppService.cs | 4 +++- .../Application/Services/AbstractKeyReadOnlyAppService.cs | 8 ++++---- .../Volo/Abp/Application/Services/ReadOnlyAppService.cs | 8 ++++---- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs index e79f0ce75f..ce44a22455 100644 --- a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs @@ -62,6 +62,8 @@ namespace Volo.Abp.Application.Services ICrudAppService where TEntity : class, IEntity { + protected new IRepository Repository { get; } + protected virtual string CreatePolicyName { get; set; } protected virtual string UpdatePolicyName { get; set; } @@ -71,7 +73,7 @@ namespace Volo.Abp.Application.Services protected AbstractKeyCrudAppService(IRepository repository) : base(repository) { - + Repository = repository; } public virtual async Task CreateAsync(TCreateInput input) diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyReadOnlyAppService.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyReadOnlyAppService.cs index e6af5484a7..45dff23852 100644 --- a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyReadOnlyAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyReadOnlyAppService.cs @@ -13,7 +13,7 @@ namespace Volo.Abp.Application.Services : AbstractKeyReadOnlyAppService where TEntity : class, IEntity { - protected AbstractKeyReadOnlyAppService(IRepository repository) + protected AbstractKeyReadOnlyAppService(IReadOnlyRepository repository) : base(repository) { @@ -24,7 +24,7 @@ namespace Volo.Abp.Application.Services : AbstractKeyReadOnlyAppService where TEntity : class, IEntity { - protected AbstractKeyReadOnlyAppService(IRepository repository) + protected AbstractKeyReadOnlyAppService(IReadOnlyRepository repository) : base(repository) { @@ -36,13 +36,13 @@ namespace Volo.Abp.Application.Services , IReadOnlyAppService where TEntity : class, IEntity { - protected IRepository Repository { get; } + protected IReadOnlyRepository Repository { get; } protected virtual string GetPolicyName { get; set; } protected virtual string GetListPolicyName { get; set; } - protected AbstractKeyReadOnlyAppService(IRepository repository) + protected AbstractKeyReadOnlyAppService(IReadOnlyRepository repository) { Repository = repository; } diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ReadOnlyAppService.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ReadOnlyAppService.cs index 0ddc4b4700..d99928126c 100644 --- a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ReadOnlyAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ReadOnlyAppService.cs @@ -13,7 +13,7 @@ namespace Volo.Abp.Application.Services where TEntity : class, IEntity where TEntityDto : IEntityDto { - protected ReadOnlyAppService(IRepository repository) + protected ReadOnlyAppService(IReadOnlyRepository repository) : base(repository) { @@ -25,7 +25,7 @@ namespace Volo.Abp.Application.Services where TEntity : class, IEntity where TEntityDto : IEntityDto { - protected ReadOnlyAppService(IRepository repository) + protected ReadOnlyAppService(IReadOnlyRepository repository) : base(repository) { @@ -38,9 +38,9 @@ namespace Volo.Abp.Application.Services where TGetOutputDto : IEntityDto where TGetListOutputDto : IEntityDto { - protected new IRepository Repository { get; } + protected new IReadOnlyRepository Repository { get; } - protected ReadOnlyAppService(IRepository repository) + protected ReadOnlyAppService(IReadOnlyRepository repository) : base(repository) { Repository = repository; From 2969614b026a390daa6bb91f4207b84b92542dd4 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 25 Jun 2020 11:10:30 +0300 Subject: [PATCH 074/190] chore(module-template): add @abp/ng.theme.basic to package.json --- templates/module/angular/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/templates/module/angular/package.json b/templates/module/angular/package.json index 9b9fa9bf80..2e4bbae86d 100644 --- a/templates/module/angular/package.json +++ b/templates/module/angular/package.json @@ -24,6 +24,7 @@ "@abp/ng.identity": "~3.0.0", "@abp/ng.tenant-management": "~3.0.0", "@abp/ng.setting-management": "~3.0.0", + "@abp/ng.theme.basic": "~3.0.0", "rxjs": "~6.5.4", "tslib": "^1.10.0", "zone.js": "~0.10.2" From 4a1f98753831b485ee66ac86d297a268e451ea7d Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 25 Jun 2020 11:18:24 +0300 Subject: [PATCH 075/190] chore: add postinstall script to module template --- templates/module/angular/package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/templates/module/angular/package.json b/templates/module/angular/package.json index 2e4bbae86d..46c77cb59e 100644 --- a/templates/module/angular/package.json +++ b/templates/module/angular/package.json @@ -8,7 +8,9 @@ "build:app": "ng build dev-app --prod", "test": "ng test", "lint": "ng lint", - "e2e": "ng e2e" + "e2e": "ng e2e", + "compile:ivy": "yarn ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points --tsconfig './tsconfig.prod.json' --source node_modules --async false", + "postinstall": "npm run compile:ivy" }, "private": true, "dependencies": { From 07a5c48155011e6d68d2328ba8e10fa76d6d1ab2 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 25 Jun 2020 11:48:44 +0300 Subject: [PATCH 076/190] chore: add symlink to module template --- templates/module/angular/package.json | 16 +++++++++------- .../projects/dev-app/src/app/app.module.ts | 4 ++-- .../projects/my-project-name/package.json | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/templates/module/angular/package.json b/templates/module/angular/package.json index 46c77cb59e..808c0c96a8 100644 --- a/templates/module/angular/package.json +++ b/templates/module/angular/package.json @@ -5,7 +5,8 @@ "ng": "ng", "start": "ng serve dev-app --open", "build": "ng build my-project-name --prod", - "build:app": "ng build dev-app --prod", + "build:app": "npm run symlink:copy -- --no-watch && ng build dev-app --prod", + "symlink:copy": "symlink copy --angular --packages @my-company-name/my-project-name --prod", "test": "ng test", "lint": "ng lint", "e2e": "ng e2e", @@ -14,6 +15,11 @@ }, "private": true, "dependencies": { + "@abp/ng.account": "~3.0.0", + "@abp/ng.identity": "~3.0.0", + "@abp/ng.setting-management": "~3.0.0", + "@abp/ng.tenant-management": "~3.0.0", + "@abp/ng.theme.basic": "~3.0.0", "@angular/animations": "~9.1.11", "@angular/common": "~9.1.11", "@angular/compiler": "~9.1.11", @@ -22,11 +28,6 @@ "@angular/platform-browser": "~9.1.11", "@angular/platform-browser-dynamic": "~9.1.11", "@angular/router": "~9.1.11", - "@abp/ng.account": "~3.0.0", - "@abp/ng.identity": "~3.0.0", - "@abp/ng.tenant-management": "~3.0.0", - "@abp/ng.setting-management": "~3.0.0", - "@abp/ng.theme.basic": "~3.0.0", "rxjs": "~6.5.4", "tslib": "^1.10.0", "zone.js": "~0.10.2" @@ -36,9 +37,9 @@ "@angular-devkit/build-ng-packagr": "~0.901.9", "@angular/cli": "~9.1.9", "@angular/compiler-cli": "~9.1.11", - "@types/node": "^12.11.1", "@types/jasmine": "~3.5.0", "@types/jasminewd2": "~2.0.3", + "@types/node": "^12.11.1", "codelyzer": "^5.1.2", "jasmine-core": "~3.5.0", "jasmine-spec-reporter": "~4.2.1", @@ -49,6 +50,7 @@ "karma-jasmine-html-reporter": "^1.4.2", "ng-packagr": "^9.0.0", "protractor": "~7.0.0", + "symlink-manager": "^1.5.0", "ts-node": "~8.3.0", "tslint": "~6.1.0", "typescript": "~3.8.3" diff --git a/templates/module/angular/projects/dev-app/src/app/app.module.ts b/templates/module/angular/projects/dev-app/src/app/app.module.ts index 7951177ca7..cb6fde207f 100644 --- a/templates/module/angular/projects/dev-app/src/app/app.module.ts +++ b/templates/module/angular/projects/dev-app/src/app/app.module.ts @@ -13,7 +13,7 @@ import { environment } from '../environments/environment'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { APP_ROUTE_PROVIDER } from './route.provider'; -import { SharedModule } from './shared/shared.module'; +import { ThemeBasicModule } from '@abp/ng.theme.basic'; @NgModule({ imports: [ @@ -32,7 +32,7 @@ import { SharedModule } from './shared/shared.module'; TenantManagementConfigModule.forRoot(), SettingManagementConfigModule.forRoot(), NgxsModule.forRoot(), - SharedModule, + ThemeBasicModule.forRoot(), ], providers: [APP_ROUTE_PROVIDER], declarations: [AppComponent], diff --git a/templates/module/angular/projects/my-project-name/package.json b/templates/module/angular/projects/my-project-name/package.json index b31bf14cf7..f13f477efd 100644 --- a/templates/module/angular/projects/my-project-name/package.json +++ b/templates/module/angular/projects/my-project-name/package.json @@ -1,5 +1,5 @@ { - "name": "my-project-name", + "name": "@my-company-name/my-project-name", "version": "0.0.1", "peerDependencies": { "@angular/common": "^9.1.11", From 1e07924a2bc2943e9000d88fe3b092ab2241dbb4 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 25 Jun 2020 11:52:12 +0300 Subject: [PATCH 077/190] chore: decrease abp versions --- templates/module/angular/package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/templates/module/angular/package.json b/templates/module/angular/package.json index 808c0c96a8..d7bc848144 100644 --- a/templates/module/angular/package.json +++ b/templates/module/angular/package.json @@ -15,11 +15,11 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~3.0.0", - "@abp/ng.identity": "~3.0.0", - "@abp/ng.setting-management": "~3.0.0", - "@abp/ng.tenant-management": "~3.0.0", - "@abp/ng.theme.basic": "~3.0.0", + "@abp/ng.account": "~2.9.0", + "@abp/ng.identity": "~2.9.0", + "@abp/ng.setting-management": "~2.9.0", + "@abp/ng.tenant-management": "~2.9.0", + "@abp/ng.theme.basic": "~2.9.0", "@angular/animations": "~9.1.11", "@angular/common": "~9.1.11", "@angular/compiler": "~9.1.11", From 7dd6850a21e00ccae396561272a0bbcbf5f050c5 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Thu, 25 Jun 2020 12:04:54 +0300 Subject: [PATCH 078/190] feat: upgrade angular version of module template to v10 --- templates/module/angular/package.json | 40 +++++++++---------- .../dev-app/{browserslist => .browserslistrc} | 0 .../projects/dev-app/e2e/tsconfig.json | 4 +- .../projects/dev-app/tsconfig.app.json | 2 +- .../projects/dev-app/tsconfig.spec.json | 2 +- .../projects/my-project-name/package.json | 4 +- .../my-project-name/tsconfig.spec.json | 2 +- templates/module/angular/tsconfig.base.json | 13 ++++++ templates/module/angular/tsconfig.json | 32 ++++++++++----- 9 files changed, 61 insertions(+), 38 deletions(-) rename templates/module/angular/projects/dev-app/{browserslist => .browserslistrc} (100%) create mode 100644 templates/module/angular/tsconfig.base.json diff --git a/templates/module/angular/package.json b/templates/module/angular/package.json index d7bc848144..594771e916 100644 --- a/templates/module/angular/package.json +++ b/templates/module/angular/package.json @@ -20,39 +20,39 @@ "@abp/ng.setting-management": "~2.9.0", "@abp/ng.tenant-management": "~2.9.0", "@abp/ng.theme.basic": "~2.9.0", - "@angular/animations": "~9.1.11", - "@angular/common": "~9.1.11", - "@angular/compiler": "~9.1.11", - "@angular/core": "~9.1.11", - "@angular/forms": "~9.1.11", - "@angular/platform-browser": "~9.1.11", - "@angular/platform-browser-dynamic": "~9.1.11", - "@angular/router": "~9.1.11", + "@angular/animations": "~10.0.0", + "@angular/common": "~10.0.0", + "@angular/compiler": "~10.0.0", + "@angular/core": "~10.0.0", + "@angular/forms": "~10.0.0", + "@angular/platform-browser": "~10.0.0", + "@angular/platform-browser-dynamic": "~10.0.0", + "@angular/router": "~10.0.0", "rxjs": "~6.5.4", - "tslib": "^1.10.0", + "tslib": "^2.0.0", "zone.js": "~0.10.2" }, "devDependencies": { - "@angular-devkit/build-angular": "~0.901.9", - "@angular-devkit/build-ng-packagr": "~0.901.9", - "@angular/cli": "~9.1.9", - "@angular/compiler-cli": "~9.1.11", + "@angular-devkit/build-angular": "~0.1000.0", + "@angular-devkit/build-ng-packagr": "~0.1000.0", + "@angular/cli": "~10.0.0", + "@angular/compiler-cli": "~10.0.0", "@types/jasmine": "~3.5.0", "@types/jasminewd2": "~2.0.3", "@types/node": "^12.11.1", "codelyzer": "^5.1.2", "jasmine-core": "~3.5.0", - "jasmine-spec-reporter": "~4.2.1", + "jasmine-spec-reporter": "~5.0.0", "karma": "~5.0.0", "karma-chrome-launcher": "~3.1.0", - "karma-coverage-istanbul-reporter": "~2.1.0", - "karma-jasmine": "~3.0.1", - "karma-jasmine-html-reporter": "^1.4.2", - "ng-packagr": "^9.0.0", + "karma-coverage-istanbul-reporter": "~3.0.2", + "karma-jasmine": "~3.3.0", + "karma-jasmine-html-reporter": "^1.5.0", + "ng-packagr": "^10.0.0", "protractor": "~7.0.0", "symlink-manager": "^1.5.0", "ts-node": "~8.3.0", "tslint": "~6.1.0", - "typescript": "~3.8.3" + "typescript": "~3.9.5" } -} +} \ No newline at end of file diff --git a/templates/module/angular/projects/dev-app/browserslist b/templates/module/angular/projects/dev-app/.browserslistrc similarity index 100% rename from templates/module/angular/projects/dev-app/browserslist rename to templates/module/angular/projects/dev-app/.browserslistrc diff --git a/templates/module/angular/projects/dev-app/e2e/tsconfig.json b/templates/module/angular/projects/dev-app/e2e/tsconfig.json index bc240fbf87..746a242801 100644 --- a/templates/module/angular/projects/dev-app/e2e/tsconfig.json +++ b/templates/module/angular/projects/dev-app/e2e/tsconfig.json @@ -1,9 +1,9 @@ { - "extends": "../../../tsconfig.json", + "extends": "../../../tsconfig.base.json", "compilerOptions": { "outDir": "../../../out-tsc/e2e", "module": "commonjs", - "target": "es5", + "target": "es2018", "types": [ "jasmine", "jasminewd2", diff --git a/templates/module/angular/projects/dev-app/tsconfig.app.json b/templates/module/angular/projects/dev-app/tsconfig.app.json index 809c09ca71..406dd61a4a 100644 --- a/templates/module/angular/projects/dev-app/tsconfig.app.json +++ b/templates/module/angular/projects/dev-app/tsconfig.app.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.json", + "extends": "../../tsconfig.base.json", "compilerOptions": { "outDir": "../../out-tsc/app", "types": [] diff --git a/templates/module/angular/projects/dev-app/tsconfig.spec.json b/templates/module/angular/projects/dev-app/tsconfig.spec.json index a8ce1d396b..ed5461c09c 100644 --- a/templates/module/angular/projects/dev-app/tsconfig.spec.json +++ b/templates/module/angular/projects/dev-app/tsconfig.spec.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.json", + "extends": "../../tsconfig.base.json", "compilerOptions": { "outDir": "../../out-tsc/spec", "types": [ diff --git a/templates/module/angular/projects/my-project-name/package.json b/templates/module/angular/projects/my-project-name/package.json index f13f477efd..e7cdae6022 100644 --- a/templates/module/angular/projects/my-project-name/package.json +++ b/templates/module/angular/projects/my-project-name/package.json @@ -8,6 +8,6 @@ "@abp/ng.theme.shared": ">=3.0.0" }, "dependencies": { - "tslib": "^1.10.0" - } + "tslib": "^2.0.0" +} } diff --git a/templates/module/angular/projects/my-project-name/tsconfig.spec.json b/templates/module/angular/projects/my-project-name/tsconfig.spec.json index 16da33db07..a9ea5ea114 100644 --- a/templates/module/angular/projects/my-project-name/tsconfig.spec.json +++ b/templates/module/angular/projects/my-project-name/tsconfig.spec.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.json", + "extends": "../../tsconfig.base.json", "compilerOptions": { "outDir": "../../out-tsc/spec", "types": [ diff --git a/templates/module/angular/tsconfig.base.json b/templates/module/angular/tsconfig.base.json new file mode 100644 index 0000000000..e8a830851f --- /dev/null +++ b/templates/module/angular/tsconfig.base.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.prod.json", + "compilerOptions": { + "paths": { + "@my-company-name/my-project-name": [ + "projects/my-project-name/src/public-api.ts" + ], + "@my-company-name/my-project-name/config": [ + "projects/my-project-name/config/src/public-api.ts" + ] + } + } +} diff --git a/templates/module/angular/tsconfig.json b/templates/module/angular/tsconfig.json index e8a830851f..35742b66e3 100644 --- a/templates/module/angular/tsconfig.json +++ b/templates/module/angular/tsconfig.json @@ -1,13 +1,23 @@ +/* + This is a "Solution Style" tsconfig.json file, and is used by editors and TypeScript’s language server to improve development experience. + It is not intended to be used to perform a compilation. + + To learn more about this file see: https://angular.io/config/solution-tsconfig. +*/ { - "extends": "./tsconfig.prod.json", - "compilerOptions": { - "paths": { - "@my-company-name/my-project-name": [ - "projects/my-project-name/src/public-api.ts" - ], - "@my-company-name/my-project-name/config": [ - "projects/my-project-name/config/src/public-api.ts" - ] + "files": [], + "references": [ + { + "path": "./projects/my-project-name/tsconfig.lib.json" + }, + { + "path": "./projects/my-project-name/tsconfig.spec.json" + }, + { + "path": "./projects/dev-app/tsconfig.app.json" + }, + { + "path": "./projects/dev-app/tsconfig.spec.json" } - } -} + ] +} \ No newline at end of file From 6d5f169cfc0d18f869459d3c960ae433c3e5e21b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 25 Jun 2020 12:09:02 +0300 Subject: [PATCH 079/190] Define OrganizationUnitEto --- .../Volo/Abp/Identity/OrganizationUnitEto.cs | 16 ++++++++++++++++ .../Volo/Abp/Identity/AbpIdentityDomainModule.cs | 1 + .../Abp/Identity/IdentityDomainMappingProfile.cs | 1 + 3 files changed, 18 insertions(+) create mode 100644 modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/OrganizationUnitEto.cs diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/OrganizationUnitEto.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/OrganizationUnitEto.cs new file mode 100644 index 0000000000..09013aa1ce --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/OrganizationUnitEto.cs @@ -0,0 +1,16 @@ +using System; + +namespace Volo.Abp.Identity +{ + [Serializable] + public class OrganizationUnitEto + { + public Guid Id { get; set; } + + public Guid? TenantId { get; set; } + + public string Code { get; set; } + + public string DisplayName { get; set; } + } +} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs index 07c4d2e971..fd6ca54ce3 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs @@ -34,6 +34,7 @@ namespace Volo.Abp.Identity options.EtoMappings.Add(typeof(AbpIdentityDomainModule)); options.EtoMappings.Add(typeof(AbpIdentityDomainModule)); options.EtoMappings.Add(typeof(AbpIdentityDomainModule)); + options.EtoMappings.Add(typeof(AbpIdentityDomainModule)); }); var identityBuilder = context.Services.AddAbpIdentity(options => diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDomainMappingProfile.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDomainMappingProfile.cs index 547525b46e..9a5557401d 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDomainMappingProfile.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDomainMappingProfile.cs @@ -10,6 +10,7 @@ namespace Volo.Abp.Identity CreateMap(); CreateMap(); CreateMap(); + CreateMap(); } } } \ No newline at end of file From 8f67597901d5554a3d2fdcee729827fb41170753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 25 Jun 2020 12:13:17 +0300 Subject: [PATCH 080/190] Apply module extensions for the OrganizationUnit entity. --- .../IdentityModuleExtensionConfiguration.cs | 9 +++++++++ .../Abp/ObjectExtending/IdentityModuleExtensionConsts.cs | 2 ++ .../Volo/Abp/Identity/AbpIdentityDomainModule.cs | 6 ++++++ 3 files changed, 17 insertions(+) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/ObjectExtending/IdentityModuleExtensionConfiguration.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/ObjectExtending/IdentityModuleExtensionConfiguration.cs index 3892fb00f6..a8e488871a 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/ObjectExtending/IdentityModuleExtensionConfiguration.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/ObjectExtending/IdentityModuleExtensionConfiguration.cs @@ -31,5 +31,14 @@ namespace Volo.Abp.ObjectExtending configureAction ); } + + public IdentityModuleExtensionConfiguration ConfigureOrganizationUnit( + Action configureAction) + { + return this.ConfigureEntity( + IdentityModuleExtensionConsts.EntityNames.OrganizationUnit, + configureAction + ); + } } } \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/ObjectExtending/IdentityModuleExtensionConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/ObjectExtending/IdentityModuleExtensionConsts.cs index 6d2b4c0653..45c9db6462 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/ObjectExtending/IdentityModuleExtensionConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/ObjectExtending/IdentityModuleExtensionConsts.cs @@ -11,6 +11,8 @@ public const string Role = "Role"; public const string ClaimType = "ClaimType"; + + public const string OrganizationUnit = "OrganizationUnit"; } } } \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs index fd6ca54ce3..d21e945f60 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs @@ -67,6 +67,12 @@ namespace Volo.Abp.Identity IdentityModuleExtensionConsts.EntityNames.ClaimType, typeof(IdentityClaimType) ); + + ModuleExtensionConfigurationHelper.ApplyEntityConfigurationToEntity( + IdentityModuleExtensionConsts.ModuleName, + IdentityModuleExtensionConsts.EntityNames.OrganizationUnit, + typeof(OrganizationUnit) + ); } private static void AddAbpIdentityOptionsFactory(IServiceCollection services) From fe4857481c4d49967e8f979af4524eaf8e49bef4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 25 Jun 2020 17:35:51 +0300 Subject: [PATCH 081/190] Resolved #4496: Introduce the DynamicStringLengthAttribute. --- .../AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs | 5 ++ .../AspNetCore/Mvc/AbpMvcOptionsExtensions.cs | 1 - .../AbpValidationAttributeAdapterProvider.cs | 29 ++++++++++ .../DynamicStringLengthAttributeAdapter.cs | 54 +++++++++++++++++ .../DynamicStringLengthAttribute.cs | 58 +++++++++++++++++++ .../Validation/ValidationTestController.cs | 24 +++++++- .../ValidationTestController_Tests.cs | 16 +++++ 7 files changed, 184 insertions(+), 3 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/AbpValidationAttributeAdapterProvider.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicStringLengthAttributeAdapter.cs create mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicStringLengthAttribute.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs index 263178e0ed..e3cee4e72b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs @@ -16,6 +16,7 @@ using System.Net; using System.Reflection; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Mvc.ApiExplorer; +using Microsoft.AspNetCore.Mvc.DataAnnotations; using Microsoft.AspNetCore.Mvc.Razor; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure; @@ -25,6 +26,7 @@ using Microsoft.Extensions.Localization; using Volo.Abp.ApiVersioning; using Volo.Abp.AspNetCore.Mvc.ApiExploring; using Volo.Abp.AspNetCore.Mvc.Conventions; +using Volo.Abp.AspNetCore.Mvc.DataAnnotations; using Volo.Abp.AspNetCore.Mvc.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.Json; using Volo.Abp.AspNetCore.Mvc.Localization; @@ -164,6 +166,9 @@ namespace Volo.Abp.AspNetCore.Mvc partManager.FeatureProviders.Add(new AbpConventionalControllerFeatureProvider(application)); partManager.ApplicationParts.AddIfNotContains(typeof(AbpAspNetCoreMvcModule).Assembly); + context.Services.Replace(ServiceDescriptor.Singleton()); + context.Services.AddSingleton(); + Configure(mvcOptions => { mvcOptions.AddAbp(context.Services); 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 4aa183a43d..59166d3e1d 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,7 +5,6 @@ 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.ModelBinding.Metadata; using Volo.Abp.AspNetCore.Mvc.Response; using Volo.Abp.AspNetCore.Mvc.Uow; using Volo.Abp.AspNetCore.Mvc.Validation; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/AbpValidationAttributeAdapterProvider.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/AbpValidationAttributeAdapterProvider.cs new file mode 100644 index 0000000000..eaceddba70 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/AbpValidationAttributeAdapterProvider.cs @@ -0,0 +1,29 @@ +using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Mvc.DataAnnotations; +using Microsoft.Extensions.Localization; +using Volo.Abp.Validation; + +namespace Volo.Abp.AspNetCore.Mvc.DataAnnotations +{ + public class AbpValidationAttributeAdapterProvider : IValidationAttributeAdapterProvider + { + private readonly ValidationAttributeAdapterProvider _defaultAdapter; + + public AbpValidationAttributeAdapterProvider(ValidationAttributeAdapterProvider defaultAdapter) + { + _defaultAdapter = defaultAdapter; + } + + public virtual IAttributeAdapter GetAttributeAdapter(ValidationAttribute attribute, IStringLocalizer stringLocalizer) + { + var type = attribute.GetType(); + + if (type == typeof(DynamicStringLengthAttribute)) + { + return new DynamicStringLengthAttributeAdapter((DynamicStringLengthAttribute) attribute, stringLocalizer); + } + + return _defaultAdapter.GetAttributeAdapter(attribute, stringLocalizer); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicStringLengthAttributeAdapter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicStringLengthAttributeAdapter.cs new file mode 100644 index 0000000000..d4c46b85f3 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicStringLengthAttributeAdapter.cs @@ -0,0 +1,54 @@ +using System; +using System.Globalization; +using Microsoft.AspNetCore.Mvc.DataAnnotations; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using Microsoft.Extensions.Localization; +using Volo.Abp.Validation; + +namespace Volo.Abp.AspNetCore.Mvc.DataAnnotations +{ + public class DynamicStringLengthAttributeAdapter : AttributeAdapterBase + { + private readonly string _max; + private readonly string _min; + + public DynamicStringLengthAttributeAdapter( + DynamicStringLengthAttribute attribute, + IStringLocalizer stringLocalizer) + : base(attribute, stringLocalizer) + { + _max = Attribute.MaximumLength.ToString(CultureInfo.InvariantCulture); + _min = Attribute.MinimumLength.ToString(CultureInfo.InvariantCulture); + } + + public override void AddValidation(ClientModelValidationContext context) + { + Check.NotNull(context, nameof(context)); + + MergeAttribute(context.Attributes, "data-val", "true"); + MergeAttribute(context.Attributes, "data-val-length", GetErrorMessage(context)); + + if (Attribute.MaximumLength != int.MaxValue) + { + MergeAttribute(context.Attributes, "data-val-length-max", _max); + } + + if (Attribute.MinimumLength != 0) + { + MergeAttribute(context.Attributes, "data-val-length-min", _min); + } + } + + public override string GetErrorMessage(ModelValidationContextBase validationContext) + { + Check.NotNull(validationContext, nameof(validationContext)); + + return GetErrorMessage( + validationContext.ModelMetadata, + validationContext.ModelMetadata.GetDisplayName(), + Attribute.MaximumLength, + Attribute.MinimumLength + ); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicStringLengthAttribute.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicStringLengthAttribute.cs new file mode 100644 index 0000000000..d27a04b1ba --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicStringLengthAttribute.cs @@ -0,0 +1,58 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics; +using System.Reflection; +using JetBrains.Annotations; + +namespace Volo.Abp.Validation +{ + /// + /// Used to determine and + /// properties on the runtime. + /// + public class DynamicStringLengthAttribute : StringLengthAttribute + { + private static readonly FieldInfo MaximumLengthField; + + static DynamicStringLengthAttribute() + { + MaximumLengthField = typeof(StringLengthAttribute).GetField( + "k__BackingField", + BindingFlags.Instance | BindingFlags.NonPublic + ); + Debug.Assert(MaximumLengthField != null, nameof(MaximumLengthField) + " != null"); + } + + /// A type to get the values of the properties + /// The name of the public static property for the + /// The name of the public static property for the + public DynamicStringLengthAttribute( + [NotNull] Type sourceType, + [CanBeNull] string maximumLengthPropertyName, + [CanBeNull] string minimumLengthPropertyName = null) + : base(0) + { + Check.NotNull(sourceType, nameof(sourceType)); + + if (maximumLengthPropertyName != null) + { + var maximumLengthProperty = sourceType.GetProperty( + maximumLengthPropertyName, + BindingFlags.Static | BindingFlags.Public + ); + Debug.Assert(maximumLengthProperty != null, nameof(maximumLengthProperty) + " != null"); + MaximumLengthField.SetValue(this, (int) maximumLengthProperty.GetValue(null)); + } + + if (minimumLengthPropertyName != null) + { + var minimumLengthProperty = sourceType.GetProperty( + minimumLengthPropertyName, + BindingFlags.Static | BindingFlags.Public + ); + Debug.Assert(minimumLengthProperty != null, nameof(minimumLengthProperty) + " != null"); + MinimumLength = (int) minimumLengthProperty.GetValue(null); + } + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController.cs index 57cb40219b..ae622acee2 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController.cs @@ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Shouldly; +using Volo.Abp.Validation; namespace Volo.Abp.AspNetCore.Mvc.Validation { @@ -31,6 +32,14 @@ namespace Volo.Abp.AspNetCore.Mvc.Validation { return Content("ModelState.IsValid: " + ModelState.IsValid.ToString().ToLowerInvariant()); } + + [HttpGet] + [Route("object-result-action-dynamic-length")] + public Task ObjectResultActionDynamicLength(ValidationDynamicTestModel model) + { + ModelState.IsValid.ShouldBeTrue(); //AbpValidationFilter throws exception otherwise + return Task.FromResult(model.Value1); + } public class ValidationTest1Model { @@ -38,6 +47,18 @@ namespace Volo.Abp.AspNetCore.Mvc.Validation [StringLength(5, MinimumLength = 2)] public string Value1 { get; set; } } + + public class ValidationDynamicTestModel + { + [DynamicStringLength(typeof(Consts), nameof(Consts.MaxValue2Length), nameof(Consts.MinValue2Length))] + public string Value1 { get; set; } + + public static class Consts + { + public static int MinValue2Length { get; set; } = 2; + public static int MaxValue2Length { get; set; } = 7; + } + } public class CustomValidateModel : IValidatableObject { @@ -51,6 +72,5 @@ namespace Volo.Abp.AspNetCore.Mvc.Validation } } } - } -} +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController_Tests.cs index 99e027f85a..767ff7aa3e 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController_Tests.cs @@ -58,5 +58,21 @@ namespace Volo.Abp.AspNetCore.Mvc.Validation result.Error.ValidationErrors.ShouldContain(x => x.Message == "Value1 should be hello"); } + [Fact] + public async Task Should_Validate_Dynamic_Length_Object_Result_Success() + { + var result = await GetResponseAsStringAsync("/api/validation-test/object-result-action-dynamic-length?value1=hello"); + result.ShouldBe("hello"); + } + + [Fact] + public async Task Should_Validate_Dynamic_Length_Object_Result_Failing() + { + var result = await GetResponseAsObjectAsync("/api/validation-test/object-result-action-dynamic-length?value1=a", HttpStatusCode.BadRequest); //value1 has min length of 2 chars. + result.Error.ValidationErrors.Length.ShouldBeGreaterThan(0); + + result = await GetResponseAsObjectAsync("/api/validation-test/object-result-action-dynamic-length?value1=12345678", HttpStatusCode.BadRequest); //value1 has max length of 7 chars. + result.Error.ValidationErrors.Length.ShouldBeGreaterThan(0); + } } } From 01ef91bd498c3bb40c82bc79212d98de6be6adbd Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 26 Jun 2020 10:09:03 +0300 Subject: [PATCH 082/190] chore: update @ngx-validate/core version --- npm/ng-packs/package.json | 2 +- .../packages/theme-shared/package.json | 2 +- npm/ng-packs/yarn.lock | 715 +++++++++--------- 3 files changed, 366 insertions(+), 353 deletions(-) diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index 2e3f6721c6..7ee57ea2bb 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -51,7 +51,7 @@ "@fortawesome/fontawesome-free": "^5.13.0", "@ng-bootstrap/ng-bootstrap": "^6.1.0", "@ngneat/spectator": "^4.5.0", - "@ngx-validate/core": "^0.0.8", + "@ngx-validate/core": "^0.0.9", "@ngxs/devtools-plugin": "^3.6.2", "@ngxs/logger-plugin": "^3.6.2", "@ngxs/router-plugin": "^3.6.2", diff --git a/npm/ng-packs/packages/theme-shared/package.json b/npm/ng-packs/packages/theme-shared/package.json index aaadacc5fc..e85744e04f 100644 --- a/npm/ng-packs/packages/theme-shared/package.json +++ b/npm/ng-packs/packages/theme-shared/package.json @@ -10,7 +10,7 @@ "@abp/ng.core": "~2.9.0", "@fortawesome/fontawesome-free": "^5.13.1", "@ng-bootstrap/ng-bootstrap": "^6.1.0", - "@ngx-validate/core": "^0.0.8", + "@ngx-validate/core": "^0.0.9", "@swimlane/ngx-datatable": "^17.0.0", "bootstrap": "^4.5.0", "chart.js": "^2.9.3" diff --git a/npm/ng-packs/yarn.lock b/npm/ng-packs/yarn.lock index 861811b32f..128fac4e85 100644 --- a/npm/ng-packs/yarn.lock +++ b/npm/ng-packs/yarn.lock @@ -139,7 +139,7 @@ jest-preset-angular "^8.1.2" lodash "^4.17.10" -"@angular-devkit/architect@0.901.9": +"@angular-devkit/architect@0.901.9", "@angular-devkit/architect@>=0.900.0 < 0.1000.0": version "0.901.9" resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.901.9.tgz#5d849a120449b2f91ec6eef44ddad74ffb7ad810" integrity sha512-Xokyh7bv4qICHpb5Xui1jPTi6ZZvzR5tbTIxT0DFWqw16TEkFgkNubQsW6mFSR3g3CXdySMfOwWExfa/rE1ggA== @@ -147,14 +147,6 @@ "@angular-devkit/core" "9.1.9" rxjs "6.5.4" -"@angular-devkit/architect@>=0.900.0 < 0.1000.0": - version "0.901.8" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.901.8.tgz#d2f5f4c16fba3ed61ee27c7fc72118421ea2b45d" - integrity sha512-tK9ZQlubH6n+q+c2J9Wvfcxg3RFuRiTfJriNoodo6GHvtF2KLdPY67w3Gen0Sp172A5Q8Y927NseddNI8RZ/0A== - dependencies: - "@angular-devkit/core" "9.1.8" - rxjs "6.5.4" - "@angular-devkit/build-angular@~0.901.9": version "0.901.9" resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.901.9.tgz#a60c41497e69d663cf2c74778cc72dd262cc09a1" @@ -261,10 +253,10 @@ rxjs "6.3.3" source-map "0.7.3" -"@angular-devkit/core@8.3.27", "@angular-devkit/core@^8.0.3": - version "8.3.27" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-8.3.27.tgz#d99e797bb0c8be643f01c707fdb3904ab347b106" - integrity sha512-Mf2u86mIMqCEbbhaN74r4lvMb4nKgAZIQo3s/GQIfKkGaGYvxmiQHkltdVvSR+fgaQ0CMh4ARI0uefmzQyUsAA== +"@angular-devkit/core@8.3.28", "@angular-devkit/core@^8.0.3": + version "8.3.28" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-8.3.28.tgz#0a733132821d916788a8ed34eff0f9149a9f3a15" + integrity sha512-tM0oPjzftJMdfuAuZF2EspVKtJyhtS2IQ02S7eKTZqkh5p/oVv710aND2D2IN5qdFrzpUSearx6D+Mr/Jo8jrA== dependencies: ajv "6.10.2" fast-json-stable-stringify "2.0.0" @@ -272,18 +264,7 @@ rxjs "6.4.0" source-map "0.7.3" -"@angular-devkit/core@9.1.8", "@angular-devkit/core@^9.0.0": - version "9.1.8" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-9.1.8.tgz#7c517a14e3ddfd180858972d9f1836aa90a1248e" - integrity sha512-4k1pZwje2oh5c/ULg7pnCBzTstx3l3uF7O5tQq/KXomDDsam97IhLm6cKUqQpaoyC1NUsBV6xJARJ0PyUP5TPQ== - dependencies: - ajv "6.12.0" - fast-json-stable-stringify "2.1.0" - magic-string "0.25.7" - rxjs "6.5.4" - source-map "0.7.3" - -"@angular-devkit/core@9.1.9": +"@angular-devkit/core@9.1.9", "@angular-devkit/core@^9.0.0": version "9.1.9" resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-9.1.9.tgz#e6283912093179313ccfc69856841e9b6b318231" integrity sha512-SWgBh4an/Vezjw2BZ5S+bKvuK5lH6gOtR8d5YjN9vxpJSZ0GimrGjfnLlWOkwWAsU8jfn4JzofECUHwX/7EW6Q== @@ -312,11 +293,11 @@ rxjs "6.3.3" "@angular-devkit/schematics@^8.0.6": - version "8.3.27" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-8.3.27.tgz#1e2c720cd464a14ec65a963025e7eb0d980eda33" - integrity sha512-SGh/yubOPT7jFZTfTyBLJqYUUBYU6pcTY3ifKVoa1JG28GegKSycusCMeX19gEY7awKYIuxR9WJeGgV6evSQPA== + version "8.3.28" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-8.3.28.tgz#80b93755e7712f838fe6a3a4a5f3f44312188a0e" + integrity sha512-WFktBtTynViexVrgHiQV9rKfNS2YNONpi25A8+5tQR5kGKuQyHI3aEN0UMNA2sztWnPQ9AI8xz2uciQsHljgDw== dependencies: - "@angular-devkit/core" "8.3.27" + "@angular-devkit/core" "8.3.28" rxjs "6.4.0" "@angular/animations@~9.1.11": @@ -417,17 +398,17 @@ resolved "https://registry.yarnpkg.com/@angular/router/-/router-9.1.11.tgz#b6d28af55fe5631bbc46f306a0e7866253d4f3b1" integrity sha512-D6CCDeSK/F6dWSB/a1g/zB072xG5LadLSV8afQ57oX1KHePx21LcoRG4tUtFMMHh/jZXRc9pMQIR1/9FrrXF3Q== -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.1", "@babel/code-frame@^7.8.3": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.1.tgz#d5481c5095daa1c57e16e54c6f9198443afb49ff" - integrity sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.3", "@babel/code-frame@^7.8.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.3.tgz#324bcfd8d35cd3d47dae18cde63d752086435e9a" + integrity sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg== dependencies: - "@babel/highlight" "^7.10.1" + "@babel/highlight" "^7.10.3" "@babel/compat-data@^7.10.1", "@babel/compat-data@^7.9.0": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.1.tgz#b1085ffe72cd17bf2c0ee790fc09f9626011b2db" - integrity sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw== + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.3.tgz#9af3e033f36e8e2d6e47570db91e64a846f5d382" + integrity sha512-BDIfJ9uNZuI0LajPfoYV28lX8kyCPMHY6uY4WH1lJdcicmAfxCK5ASzaeV0D/wsUaRH/cLk+amuxtC37sZ8TUg== dependencies: browserslist "^4.12.0" invariant "^2.2.4" @@ -477,18 +458,18 @@ source-map "^0.5.0" "@babel/core@^7.1.0", "@babel/core@^7.7.5": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.2.tgz#bd6786046668a925ac2bd2fd95b579b92a23b36a" - integrity sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ== + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.3.tgz#73b0e8ddeec1e3fdd7a2de587a60e17c440ec77e" + integrity sha512-5YqWxYE3pyhIi84L84YcwjeEgS+fa7ZjK6IBVGTjDVfm64njkR2lfDhVR5OudLk8x2GK59YoSyVv+L/03k1q9w== dependencies: - "@babel/code-frame" "^7.10.1" - "@babel/generator" "^7.10.2" + "@babel/code-frame" "^7.10.3" + "@babel/generator" "^7.10.3" "@babel/helper-module-transforms" "^7.10.1" "@babel/helpers" "^7.10.1" - "@babel/parser" "^7.10.2" - "@babel/template" "^7.10.1" - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.2" + "@babel/parser" "^7.10.3" + "@babel/template" "^7.10.3" + "@babel/traverse" "^7.10.3" + "@babel/types" "^7.10.3" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" @@ -508,12 +489,12 @@ lodash "^4.17.13" source-map "^0.5.0" -"@babel/generator@^7.10.1", "@babel/generator@^7.10.2", "@babel/generator@^7.8.3", "@babel/generator@^7.9.0": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.2.tgz#0fa5b5b2389db8bfdfcc3492b551ee20f5dd69a9" - integrity sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA== +"@babel/generator@^7.10.3", "@babel/generator@^7.8.3", "@babel/generator@^7.9.0": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.3.tgz#32b9a0d963a71d7a54f5f6c15659c3dbc2a523a5" + integrity sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA== dependencies: - "@babel/types" "^7.10.2" + "@babel/types" "^7.10.3" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" @@ -526,12 +507,12 @@ "@babel/types" "^7.10.1" "@babel/helper-builder-binary-assignment-operator-visitor@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz#0ec7d9be8174934532661f87783eb18d72290059" - integrity sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw== + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.3.tgz#4e9012d6701bef0030348d7f9c808209bd3e8687" + integrity sha512-lo4XXRnBlU6eRM92FkiZxpo1xFLmv3VsPFk61zJKMm7XYJfwqXHsYJTY6agoc4a3L8QPw1HqWehO18coZgbT6A== dependencies: - "@babel/helper-explode-assignable-expression" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/helper-explode-assignable-expression" "^7.10.3" + "@babel/types" "^7.10.3" "@babel/helper-compilation-targets@^7.8.7": version "7.10.2" @@ -553,59 +534,59 @@ "@babel/helper-regex" "^7.10.1" regexpu-core "^4.7.0" -"@babel/helper-define-map@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz#5e69ee8308648470dd7900d159c044c10285221d" - integrity sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg== +"@babel/helper-define-map@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.3.tgz#d27120a5e57c84727b30944549b2dfeca62401a8" + integrity sha512-bxRzDi4Sin/k0drWCczppOhov1sBSdBvXJObM1NLHQzjhXhwRtn7aRWGvLJWCYbuu2qUk3EKs6Ci9C9ps8XokQ== dependencies: - "@babel/helper-function-name" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/helper-function-name" "^7.10.3" + "@babel/types" "^7.10.3" lodash "^4.17.13" -"@babel/helper-explode-assignable-expression@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz#e9d76305ee1162ca467357ae25df94f179af2b7e" - integrity sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg== +"@babel/helper-explode-assignable-expression@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.3.tgz#9dc14f0cfa2833ea830a9c8a1c742b6e7461b05e" + integrity sha512-0nKcR64XrOC3lsl+uhD15cwxPvaB6QKUDlD84OT9C3myRbhJqTMYir69/RWItUvHpharv0eJ/wk7fl34ONSwZw== dependencies: - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/traverse" "^7.10.3" + "@babel/types" "^7.10.3" -"@babel/helper-function-name@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz#92bd63829bfc9215aca9d9defa85f56b539454f4" - integrity sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ== +"@babel/helper-function-name@^7.10.1", "@babel/helper-function-name@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz#79316cd75a9fa25ba9787ff54544307ed444f197" + integrity sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw== dependencies: - "@babel/helper-get-function-arity" "^7.10.1" - "@babel/template" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/helper-get-function-arity" "^7.10.3" + "@babel/template" "^7.10.3" + "@babel/types" "^7.10.3" -"@babel/helper-get-function-arity@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz#7303390a81ba7cb59613895a192b93850e373f7d" - integrity sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw== +"@babel/helper-get-function-arity@^7.10.1", "@babel/helper-get-function-arity@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz#3a28f7b28ccc7719eacd9223b659fdf162e4c45e" + integrity sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg== dependencies: - "@babel/types" "^7.10.1" + "@babel/types" "^7.10.3" -"@babel/helper-hoist-variables@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz#7e77c82e5dcae1ebf123174c385aaadbf787d077" - integrity sha512-vLm5srkU8rI6X3+aQ1rQJyfjvCBLXP8cAGeuw04zeAM2ItKb1e7pmVmLyHb4sDaAYnLL13RHOZPLEtcGZ5xvjg== +"@babel/helper-hoist-variables@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.3.tgz#d554f52baf1657ffbd7e5137311abc993bb3f068" + integrity sha512-9JyafKoBt5h20Yv1+BXQMdcXXavozI1vt401KBiRc2qzUepbVnd7ogVNymY1xkQN9fekGwfxtotH2Yf5xsGzgg== dependencies: - "@babel/types" "^7.10.1" + "@babel/types" "^7.10.3" "@babel/helper-member-expression-to-functions@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz#432967fd7e12a4afef66c4687d4ca22bc0456f15" - integrity sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g== + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.3.tgz#bc3663ac81ac57c39148fef4c69bf48a77ba8dd6" + integrity sha512-q7+37c4EPLSjNb2NmWOjNwj0+BOyYlssuQ58kHEWk1Z78K5i8vTUsteq78HMieRPQSl/NtpQyJfdjt3qZ5V2vw== dependencies: - "@babel/types" "^7.10.1" + "@babel/types" "^7.10.3" "@babel/helper-module-imports@^7.10.1", "@babel/helper-module-imports@^7.8.3": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz#dd331bd45bccc566ce77004e9d05fe17add13876" - integrity sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg== + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.3.tgz#766fa1d57608e53e5676f23ae498ec7a95e1b11a" + integrity sha512-Jtqw5M9pahLSUWA+76nhK9OG8nwYXzhQzVIGFoNaHnXF/r4l7kz4Fl0UAW7B6mqC5myoJiBP5/YQlXQTMfHI9w== dependencies: - "@babel/types" "^7.10.1" + "@babel/types" "^7.10.3" "@babel/helper-module-transforms@^7.10.1", "@babel/helper-module-transforms@^7.9.0": version "7.10.1" @@ -620,17 +601,17 @@ "@babel/types" "^7.10.1" lodash "^4.17.13" -"@babel/helper-optimise-call-expression@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz#b4a1f2561870ce1247ceddb02a3860fa96d72543" - integrity sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg== +"@babel/helper-optimise-call-expression@^7.10.1", "@babel/helper-optimise-call-expression@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.3.tgz#f53c4b6783093195b0f69330439908841660c530" + integrity sha512-kT2R3VBH/cnSz+yChKpaKRJQJWxdGoc6SjioRId2wkeV3bK0wLLioFpJROrX0U4xr/NmxSSAWT/9Ih5snwIIzg== dependencies: - "@babel/types" "^7.10.1" + "@babel/types" "^7.10.3" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.1", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz#ec5a5cf0eec925b66c60580328b122c01230a127" - integrity sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.1", "@babel/helper-plugin-utils@^7.10.3", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz#aac45cccf8bc1873b99a85f34bceef3beb5d3244" + integrity sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g== "@babel/helper-regex@^7.10.1": version "7.10.1" @@ -639,16 +620,16 @@ dependencies: lodash "^4.17.13" -"@babel/helper-remap-async-to-generator@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz#bad6aaa4ff39ce8d4b82ccaae0bfe0f7dbb5f432" - integrity sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A== +"@babel/helper-remap-async-to-generator@^7.10.1", "@babel/helper-remap-async-to-generator@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.3.tgz#18564f8a6748be466970195b876e8bba3bccf442" + integrity sha512-sLB7666ARbJUGDO60ZormmhQOyqMX/shKBXZ7fy937s+3ID8gSrneMvKSSb+8xIM5V7Vn6uNVtOY1vIm26XLtA== dependencies: "@babel/helper-annotate-as-pure" "^7.10.1" "@babel/helper-wrap-function" "^7.10.1" - "@babel/template" "^7.10.1" - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/template" "^7.10.3" + "@babel/traverse" "^7.10.3" + "@babel/types" "^7.10.3" "@babel/helper-replace-supers@^7.10.1": version "7.10.1" @@ -675,10 +656,10 @@ dependencies: "@babel/types" "^7.10.1" -"@babel/helper-validator-identifier@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz#5770b0c1a826c4f53f5ede5e153163e0318e94b5" - integrity sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw== +"@babel/helper-validator-identifier@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz#60d9847f98c4cea1b279e005fdb7c28be5412d15" + integrity sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw== "@babel/helper-wrap-function@^7.10.1": version "7.10.1" @@ -699,27 +680,27 @@ "@babel/traverse" "^7.10.1" "@babel/types" "^7.10.1" -"@babel/highlight@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.1.tgz#841d098ba613ba1a427a2b383d79e35552c38ae0" - integrity sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg== +"@babel/highlight@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.3.tgz#c633bb34adf07c5c13156692f5922c81ec53f28d" + integrity sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw== dependencies: - "@babel/helper-validator-identifier" "^7.10.1" + "@babel/helper-validator-identifier" "^7.10.3" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.10.1", "@babel/parser@^7.10.2", "@babel/parser@^7.8.3", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.2.tgz#871807f10442b92ff97e4783b9b54f6a0ca812d0" - integrity sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.10.3", "@babel/parser@^7.8.3", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.3.tgz#7e71d892b0d6e7d04a1af4c3c79d72c1f10f5315" + integrity sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA== "@babel/plugin-proposal-async-generator-functions@^7.8.3": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz#6911af5ba2e615c4ff3c497fe2f47b35bf6d7e55" - integrity sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw== + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.3.tgz#5a02453d46e5362e2073c7278beab2e53ad7d939" + integrity sha512-WUUWM7YTOudF4jZBAJIW9D7aViYC/Fn0Pln4RIHlQALyno3sXSjqmTA4Zy1TKC2D49RCR8Y/Pn4OIUtEypK3CA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-remap-async-to-generator" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/helper-remap-async-to-generator" "^7.10.3" "@babel/plugin-syntax-async-generators" "^7.8.0" "@babel/plugin-proposal-dynamic-import@^7.8.3": @@ -755,11 +736,11 @@ "@babel/plugin-syntax-numeric-separator" "^7.10.1" "@babel/plugin-proposal-object-rest-spread@^7.9.0": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz#cba44908ac9f142650b4a65b8aa06bf3478d5fb6" - integrity sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ== + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.3.tgz#b8d0d22f70afa34ad84b7a200ff772f9b9fce474" + integrity sha512-ZZh5leCIlH9lni5bU/wB/UcjtcVLgR8gc+FAgW2OOY+m9h1II3ItTO1/cewNUcsIDZSYcSaz/rYVls+Fb0ExVQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.3" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-transform-parameters" "^7.10.1" @@ -772,11 +753,11 @@ "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" "@babel/plugin-proposal-optional-chaining@^7.9.0": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz#15f5d6d22708629451a91be28f8facc55b0e818c" - integrity sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA== + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.3.tgz#9a726f94622b653c0a3a7a59cdce94730f526f7c" + integrity sha512-yyG3n9dJ1vZ6v5sfmIlMMZ8azQoqx/5/nZTSWX1td6L1H1bsjzA8TInDChpafCZiJkeOFzp/PtrfigAQXxI1Ng== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.3" "@babel/plugin-syntax-optional-chaining" "^7.8.0" "@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": @@ -910,25 +891,25 @@ lodash "^4.17.13" "@babel/plugin-transform-classes@^7.9.0": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz#6e11dd6c4dfae70f540480a4702477ed766d733f" - integrity sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ== + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.3.tgz#8d9a656bc3d01f3ff69e1fccb354b0f9d72ac544" + integrity sha512-irEX0ChJLaZVC7FvvRoSIxJlmk0IczFLcwaRXUArBKYHCHbOhe57aG8q3uw/fJsoSXvZhjRX960hyeAGlVBXZw== dependencies: "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/helper-define-map" "^7.10.1" - "@babel/helper-function-name" "^7.10.1" - "@babel/helper-optimise-call-expression" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-define-map" "^7.10.3" + "@babel/helper-function-name" "^7.10.3" + "@babel/helper-optimise-call-expression" "^7.10.3" + "@babel/helper-plugin-utils" "^7.10.3" "@babel/helper-replace-supers" "^7.10.1" "@babel/helper-split-export-declaration" "^7.10.1" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.8.3": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz#59aa399064429d64dce5cf76ef9b90b7245ebd07" - integrity sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ== + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.3.tgz#d3aa6eef67cb967150f76faff20f0abbf553757b" + integrity sha512-GWzhaBOsdbjVFav96drOz7FzrcEW6AP5nax0gLIpstiFaI3LOb2tAg06TimaWU6YKOfUACK3FVrxPJ4GSc5TgA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.3" "@babel/plugin-transform-destructuring@^7.8.3": version "7.10.1" @@ -1009,13 +990,13 @@ babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-systemjs@^7.9.0": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.1.tgz#9962e4b0ac6aaf2e20431ada3d8ec72082cbffb6" - integrity sha512-ewNKcj1TQZDL3YnO85qh9zo1YF1CHgmSTlRQgHqe63oTrMI85cthKtZjAiZSsSNjPQ5NCaYo5QkbYqEw1ZBgZA== + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.3.tgz#004ae727b122b7b146b150d50cba5ffbff4ac56b" + integrity sha512-GWXWQMmE1GH4ALc7YXW56BTh/AlzvDWhUNn9ArFF0+Cz5G8esYlVbXfdyHa1xaD1j+GnBoCeoQNlwtZTVdiG/A== dependencies: - "@babel/helper-hoist-variables" "^7.10.1" + "@babel/helper-hoist-variables" "^7.10.3" "@babel/helper-module-transforms" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.3" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-umd@^7.9.0": @@ -1027,9 +1008,9 @@ "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" - integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.3.tgz#a4f8444d1c5a46f35834a410285f2c901c007ca6" + integrity sha512-I3EH+RMFyVi8Iy/LekQm948Z4Lz4yKT7rK+vuCAeRm0kTa6Z5W7xuhRxDNJv0FPya/her6AUgrDITb70YHtTvA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.8.3" @@ -1064,9 +1045,9 @@ "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-transform-regenerator@^7.8.7": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz#10e175cbe7bdb63cc9b39f9b3f823c5c7c5c5490" - integrity sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw== + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.3.tgz#6ec680f140a5ceefd291c221cb7131f6d7e8cb6d" + integrity sha512-H5kNeW0u8mbk0qa1jVIVTeJJL6/TJ81ltD4oyPx0P499DhMJrTmmIFCmJ3QloGpQG8K9symccB7S7SJpCKLwtw== dependencies: regenerator-transform "^0.14.2" @@ -1100,12 +1081,12 @@ "@babel/helper-regex" "^7.10.1" "@babel/plugin-transform-template-literals@^7.8.3": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz#914c7b7f4752c570ea00553b4284dad8070e8628" - integrity sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg== + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.3.tgz#69d39b3d44b31e7b4864173322565894ce939b25" + integrity sha512-yaBn9OpxQra/bk0/CaA4wr41O0/Whkg6nqjqApcinxM7pro51ojhX6fv1pimAnVjVfDy14K0ULoRL70CA9jWWA== dependencies: "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.3" "@babel/plugin-transform-typeof-symbol@^7.8.4": version "7.10.1" @@ -1200,9 +1181,9 @@ esutils "^2.0.2" "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.2.tgz#d103f21f2602497d38348a32e008637d506db839" - integrity sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg== + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.3.tgz#670d002655a7c366540c67f6fd3342cd09500364" + integrity sha512-RzGO0RLSdokm9Ipe/YD+7ww8X2Ro79qiXZF3HU9ljrM+qnJmH1Vqth+hbiQZy761LnMJTMitHDuKVYTk3k4dLw== dependencies: regenerator-runtime "^0.13.4" @@ -1215,36 +1196,36 @@ "@babel/parser" "^7.8.6" "@babel/types" "^7.8.6" -"@babel/template@^7.10.1", "@babel/template@^7.3.3", "@babel/template@^7.8.3", "@babel/template@^7.8.6": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.1.tgz#e167154a94cb5f14b28dc58f5356d2162f539811" - integrity sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig== +"@babel/template@^7.10.1", "@babel/template@^7.10.3", "@babel/template@^7.3.3", "@babel/template@^7.8.3", "@babel/template@^7.8.6": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.3.tgz#4d13bc8e30bf95b0ce9d175d30306f42a2c9a7b8" + integrity sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA== dependencies: - "@babel/code-frame" "^7.10.1" - "@babel/parser" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/code-frame" "^7.10.3" + "@babel/parser" "^7.10.3" + "@babel/types" "^7.10.3" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.1", "@babel/traverse@^7.8.3", "@babel/traverse@^7.9.0": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.1.tgz#bbcef3031e4152a6c0b50147f4958df54ca0dd27" - integrity sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.1", "@babel/traverse@^7.10.3", "@babel/traverse@^7.8.3", "@babel/traverse@^7.9.0": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.3.tgz#0b01731794aa7b77b214bcd96661f18281155d7e" + integrity sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug== dependencies: - "@babel/code-frame" "^7.10.1" - "@babel/generator" "^7.10.1" - "@babel/helper-function-name" "^7.10.1" + "@babel/code-frame" "^7.10.3" + "@babel/generator" "^7.10.3" + "@babel/helper-function-name" "^7.10.3" "@babel/helper-split-export-declaration" "^7.10.1" - "@babel/parser" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/parser" "^7.10.3" + "@babel/types" "^7.10.3" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.2.tgz#30283be31cad0dbf6fb00bd40641ca0ea675172d" - integrity sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng== +"@babel/types@^7.0.0", "@babel/types@^7.10.1", "@babel/types@^7.10.3", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.3.tgz#6535e3b79fea86a6b09e012ea8528f935099de8e" + integrity sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA== dependencies: - "@babel/helper-validator-identifier" "^7.10.1" + "@babel/helper-validator-identifier" "^7.10.3" lodash "^4.17.13" to-fast-properties "^2.0.0" @@ -1261,34 +1242,39 @@ exec-sh "^0.3.2" minimist "^1.2.0" -"@commitlint/execute-rule@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-8.3.4.tgz#1b63f0713b197889d90b76f9eea1abc010d256b1" - integrity sha512-f4HigYjeIBn9f7OuNv5zh2y5vWaAhNFrfeul8CRJDy82l3Y+09lxOTGxfF3uMXKrZq4LmuK6qvvRCZ8mUrVvzQ== +"@commitlint/execute-rule@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-9.0.1.tgz#59993cf87103d75b56c6ae790cd4240c1863b3c2" + integrity sha512-fxnLadXs59qOBE9dInfQjQ4DmbGToQ0NjfqqmN6N8qS+KsCecO6N0mMUrC95et9xTeimFRr+0l9UMfmRVHNS/w== "@commitlint/load@>6.1.1": - version "8.3.5" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-8.3.5.tgz#3f059225ede92166ba94cf4c48e3d67c8b08b18a" - integrity sha512-poF7R1CtQvIXRmVIe63FjSQmN9KDqjRtU5A6hxqXBga87yB2VUJzic85TV6PcQc+wStk52cjrMI+g0zFx+Zxrw== - dependencies: - "@commitlint/execute-rule" "^8.3.4" - "@commitlint/resolve-extends" "^8.3.5" - babel-runtime "^6.23.0" - chalk "2.4.2" - cosmiconfig "^5.2.0" - lodash "4.17.15" + version "9.0.1" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-9.0.1.tgz#02ba5795e56da9d6c83dccdc36a6ac940d048c36" + integrity sha512-6ix/pUjVAggmDLTcnpyk0bgY3H9UBBTsEeFvTkHV+WQ6LNIxsQk8SwEOEZzWHUqt0pxqMQeiUgYeSZsSw2+uiw== + dependencies: + "@commitlint/execute-rule" "^9.0.1" + "@commitlint/resolve-extends" "^9.0.1" + "@commitlint/types" "^9.0.1" + chalk "3.0.0" + cosmiconfig "^6.0.0" + lodash "^4.17.15" resolve-from "^5.0.0" -"@commitlint/resolve-extends@^8.3.5": - version "8.3.5" - resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-8.3.5.tgz#8fff800f292ac217ae30b1862f5f9a84b278310a" - integrity sha512-nHhFAK29qiXNe6oH6uG5wqBnCR+BQnxlBW/q5fjtxIaQALgfoNLHwLS9exzbIRFqwJckpR6yMCfgMbmbAOtklQ== +"@commitlint/resolve-extends@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-9.0.1.tgz#1b8b03c2b91602cb1c6b0feac41c6636b2c517ba" + integrity sha512-o6Lya2ILg1tEfWatS5x8w4ImvDzwb1whxsr2c/cxVCFqLF4hxHHHniZ0NJ+HFhYa1kBsYeKlD1qn9fHX5Y1+PQ== dependencies: import-fresh "^3.0.0" - lodash "4.17.15" + lodash "^4.17.15" resolve-from "^5.0.0" resolve-global "^1.0.0" +"@commitlint/types@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-9.0.1.tgz#df281f0f3d8f3adb10c95e4dd72b16acf41b5400" + integrity sha512-wo2rHprtDzTHf4tiSxavktJ52ntiwmg7eHNGFLH38G1of8OfGVwOc1sVbpM4jN/HK/rCMhYOi6xzoPqsv0537A== + "@evocateur/libnpmaccess@^3.1.2": version "3.1.2" resolved "https://registry.yarnpkg.com/@evocateur/libnpmaccess/-/libnpmaccess-3.1.2.tgz#ecf7f6ce6b004e9f942b098d92200be4a4b1c845" @@ -1364,9 +1350,9 @@ which "^1.3.1" "@fortawesome/fontawesome-free@^5.12.1", "@fortawesome/fontawesome-free@^5.13.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.13.0.tgz#fcb113d1aca4b471b709e8c9c168674fbd6e06d9" - integrity sha512-xKOeQEl5O47GPZYIMToj6uuA2syyFlq9EMSl2ui0uytjY9xbe8XS0pexNWmxrdcCyNGyDmLyYw5FtKsalBUeOg== + version "5.13.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.13.1.tgz#c53b4066edae16cd1fd669f687baf031b45fb9d6" + integrity sha512-D819f34FLHeBN/4xvw0HR0u7U2G7RqjPSggXqf7LktsxWQ48VAfGwvMrhcVuaZV2fF069c/619RdgCCms0DHhw== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -1561,6 +1547,16 @@ "@types/yargs" "^15.0.0" chalk "^3.0.0" +"@jest/types@^26.1.0": + version "26.1.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.1.0.tgz#f8afaaaeeb23b5cad49dd1f7779689941dcb6057" + integrity sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + "@jsdevtools/coverage-istanbul-loader@3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.3.tgz#102e414b02ae2f0b3c7fd45a705601e1fd4867c5" @@ -2305,6 +2301,13 @@ dependencies: tslib "^1.9.0" +"@ngx-validate/core@^0.0.9": + version "0.0.9" + resolved "https://registry.yarnpkg.com/@ngx-validate/core/-/core-0.0.9.tgz#c5baea9e6f2f28c70d1adaf1edde5a9bcc8929c0" + integrity sha512-bvgwGr3l47gyxqsfKkI8c7UNMlv8ct/OvwYVDjYI7GBt0A+nhBb+xFmirWbBkMT64bUI0Y8pWIiB5qiewPG1WA== + dependencies: + tslib "^1.9.0" + "@ngxs/devtools-plugin@^3.6.2": version "3.6.2" resolved "https://registry.yarnpkg.com/@ngxs/devtools-plugin/-/devtools-plugin-3.6.2.tgz#aa0a4835f90fb905951d7712dc3ce508cbc15a2c" @@ -2447,9 +2450,9 @@ universal-user-agent "^5.0.0" "@octokit/rest@^16.28.4": - version "16.43.1" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.43.1.tgz#3b11e7d1b1ac2bbeeb23b08a17df0b20947eda6b" - integrity sha512-gfFKwRT/wFxq5qlNjnW2dh+qh74XgTQ2B179UX5K1HYCluioWj8Ndbgqw2PVqa1NnVJkGHp2ovMpVn/DImlmkw== + version "16.43.2" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.43.2.tgz#c53426f1e1d1044dee967023e3279c50993dd91b" + integrity sha512-ngDBevLbBTFfrHZeiS7SAMAZ6ssuVmXuya+F/7RaVvlysgGa1JKJkKWY+jV6TCJYcW0OALfJ7nTIGXcBXzycfQ== dependencies: "@octokit/auth-token" "^2.4.0" "@octokit/plugin-paginate-rest" "^1.1.1" @@ -2587,9 +2590,9 @@ wait-for-expect "^1.3.0" "@types/babel__core@^7.1.7": - version "7.1.8" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.8.tgz#057f725aca3641f49fc11c7a87a9de5ec588a5d7" - integrity sha512-KXBiQG2OXvaPWFPDS1rD8yV9vO0OuWIqAEqLsbfX0oU2REN5KuoMnZ1gClWcBhO5I3n6oTVAmrMufOvRqdmFTQ== + version "7.1.9" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d" + integrity sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -2670,9 +2673,9 @@ "@types/istanbul-lib-report" "*" "@types/jasmine@^3.3.9": - version "3.5.10" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.5.10.tgz#a1a41012012b5da9d4b205ba9eba58f6cce2ab7b" - integrity sha512-3F8qpwBAiVc5+HPJeXJpbrl+XjawGmciN5LgiO7Gv1pl1RHtjoMNqZpqEksaPJW05ViKe8snYInRs6xB25Xdew== + version "3.5.11" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.5.11.tgz#ba8e80639dffbe277f49c708b45373a320d158e2" + integrity sha512-fg1rOd/DehQTIJTifGqGVY6q92lDgnLfs7C6t1ccSwQrMyoTGSoH6wWzhJDZb6ezhsdwAX4EIBLe8w5fXWmEng== "@types/jest@^25.2.3": version "25.2.3" @@ -2698,9 +2701,9 @@ integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= "@types/node@*", "@types/node@>= 8": - version "14.0.13" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.13.tgz#ee1128e881b874c371374c1f72201893616417c9" - integrity sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA== + version "14.0.14" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.14.tgz#24a0b5959f16ac141aeb0c5b3cd7a15b7c64cbce" + integrity sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ== "@types/node@^12.11.1": version "12.12.47" @@ -2717,6 +2720,11 @@ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + "@types/prettier@^1.19.0": version "1.19.1" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f" @@ -3014,9 +3022,9 @@ add-stream@^1.0.0: integrity sha1-anmQQ3ynNtXhKI25K9MmbV9csqo= adm-zip@^0.4.9: - version "0.4.14" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.14.tgz#2cf312bcc9f8875df835b0f6040bd89be0a727a9" - integrity sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g== + version "0.4.16" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== agent-base@4, agent-base@^4.3.0: version "4.3.0" @@ -3053,9 +3061,9 @@ ajv-errors@^1.0.0: integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" - integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== + version "3.5.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.0.tgz#5c894537098785926d71e696114a53ce768ed773" + integrity sha512-eyoaac3btgU8eJlvh01En8OCKzRqlLe2G5jDsCr3RiE2uLGMEEB1aaGwVVpwR8M95956tGH6R+9edC++OvzaVw== ajv@6.10.2: version "6.10.2" @@ -3432,16 +3440,16 @@ autoprefixer@9.7.4: postcss-value-parser "^4.0.2" autoprefixer@^9.7.6: - version "9.8.0" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.0.tgz#68e2d2bef7ba4c3a65436f662d0a56a741e56511" - integrity sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A== + version "9.8.4" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.4.tgz#736f1012673a70fa3464671d78d41abd54512863" + integrity sha512-84aYfXlpUe45lvmS+HoAWKCkirI/sw4JK0/bTeeqgHYco3dcsOn0NqdejISjptsYwNji/21dnkDri9PsYKk89A== dependencies: browserslist "^4.12.0" - caniuse-lite "^1.0.30001061" - chalk "^2.4.2" + caniuse-lite "^1.0.30001087" + colorette "^1.2.0" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.30" + postcss "^7.0.32" postcss-value-parser "^4.1.0" aws-sign2@~0.7.0: @@ -3537,14 +3545,6 @@ babel-preset-jest@^25.5.0: babel-plugin-jest-hoist "^25.5.0" babel-preset-current-node-syntax "^0.1.2" -babel-runtime@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -3791,14 +3791,14 @@ browserify-zlib@^0.2.0: pako "~1.0.5" browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.8.3, browserslist@^4.8.5, browserslist@^4.9.1: - version "4.12.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz#06c6d5715a1ede6c51fc39ff67fd647f740b656d" - integrity sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg== + version "4.12.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.1.tgz#6d08bef149b70d153930780ba762644e0f329122" + integrity sha512-WMjXwFtPskSW1pQUDJRxvRKRkeCr7usN0O/Za76N+F4oadaTdQHotSGcX9jT/Hs7mSKPkyMFNvqawB/1HzYDKQ== dependencies: - caniuse-lite "^1.0.30001043" - electron-to-chromium "^1.3.413" - node-releases "^1.1.53" - pkg-up "^2.0.0" + caniuse-lite "^1.0.30001088" + electron-to-chromium "^1.3.481" + escalade "^3.0.1" + node-releases "^1.1.58" browserstack@^1.5.1: version "1.6.0" @@ -4075,10 +4075,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001032, caniuse-lite@^1.0.30001043, caniuse-lite@^1.0.30001061: - version "1.0.30001084" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001084.tgz#00e471931eaefbeef54f46aa2203914d3c165669" - integrity sha512-ftdc5oGmhEbLUuMZ/Qp3mOpzfZLCxPYKcvGv6v2dJJ+8EdqcvZRbAGOiLmkM/PV1QGta/uwBs8/nCl6sokDW6w== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001032, caniuse-lite@^1.0.30001087, caniuse-lite@^1.0.30001088: + version "1.0.30001088" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001088.tgz#23a6b9e192106107458528858f2c0e0dba0d9073" + integrity sha512-6eYUrlShRYveyqKG58HcyOfPgh3zb2xqs7NvT2VVtP3hEUeeWvc3lqhpeMTxYWBBeeaT9A4bKsrtjATm66BTHg== canonical-path@1.0.0: version "1.0.0" @@ -4097,14 +4097,13 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== +chalk@3.0.0, chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" + ansi-styles "^4.1.0" + supports-color "^7.1.0" chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" @@ -4117,13 +4116,14 @@ chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" chalk@^4.0.0: version "4.1.0" @@ -4451,6 +4451,11 @@ color@^3.0.0: color-convert "^1.9.1" color-string "^1.5.2" +colorette@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.0.tgz#45306add826d196e8c87236ac05d797f25982e63" + integrity sha512-soRSroY+OF/8OdA3PTQXwaDJeMc7TfknKKrxeSCencL2a4+Tx5zhxmmv7hdpCjhKBjehzp8+bwe/T68K0hpIjw== + columnify@^1.5.4: version "1.5.4" resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" @@ -4466,7 +4471,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.11.0, commander@^2.12.1, commander@^2.20.0, commander@~2.20.3: +commander@^2.11.0, commander@^2.12.1, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -4876,17 +4881,12 @@ core-js@3.6.4: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== -core-js@^2.4.0: - version "2.6.11" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" - integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== - core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cosmiconfig@^5.0.0, cosmiconfig@^5.1.0, cosmiconfig@^5.2.0: +cosmiconfig@^5.0.0, cosmiconfig@^5.1.0: version "5.2.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== @@ -4896,6 +4896,17 @@ cosmiconfig@^5.0.0, cosmiconfig@^5.1.0, cosmiconfig@^5.2.0: js-yaml "^3.13.1" parse-json "^4.0.0" +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" @@ -5642,15 +5653,15 @@ 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.413: - version "1.3.475" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.475.tgz#67688cc82c342f39594a412286e975eda45d8412" - integrity sha512-vcTeLpPm4+ccoYFXnepvkFt0KujdyrBU19KNEO40Pnkhta6mUi2K0Dn7NmpRcNz7BvysnSqeuIYScP003HWuYg== +electron-to-chromium@^1.3.481: + version "1.3.483" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.483.tgz#9269e7cfc1c8e72709824da171cbe47ca5e3ca9e" + integrity sha512-+05RF8S9rk8S0G8eBCqBRBaRq7+UN3lDs2DAvnG8SBSgQO3hjy0+qt4CmRk5eiuGbTcaicgXfPmBi31a+BD3lg== elliptic@^6.0.0, elliptic@^6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" - integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== + version "6.5.3" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" + integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -5784,6 +5795,11 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" +escalade@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.1.tgz#52568a77443f6927cd0ab9c73129137533c965ed" + integrity sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA== + escape-goat@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" @@ -5800,9 +5816,9 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escodegen@^1.11.1: - version "1.14.2" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.2.tgz#14ab71bf5026c2aa08173afba22c6f3173284a84" - integrity sha512-InuOIiKk8wwuOFg6x9BQXbzjrQhtyXh46K9bqVTPzSo2FnyMBaYGBMC6PhQy7yxxil9vIedFBweQBMK74/7o8A== + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== dependencies: esprima "^4.0.1" estraverse "^4.2.0" @@ -6254,7 +6270,7 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -6295,9 +6311,9 @@ flush-write-stream@^1.0.0: readable-stream "^2.3.6" follow-redirects@^1.0.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.12.0.tgz#ff0ccf85cf2c867c481957683b5f91b75b25e240" - integrity sha512-JgawlbfBQKjbKegPn8vUsvJqplE7KHJuhGO4yPcb+ZOIYKSr+xobMVlfRBToZwZUUxy7lFiKBdFNloz9ui368Q== + version "1.12.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.12.1.tgz#de54a6205311b93d60398ebc01cf7015682312b6" + integrity sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg== font-awesome@^4.7.0: version "4.7.0" @@ -7113,7 +7129,7 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.0.0: +import-fresh@^3.0.0, import-fresh@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== @@ -8027,17 +8043,17 @@ jest-mock@^25.5.0: "@jest/types" "^25.5.0" jest-pnp-resolver@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" - integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== jest-preset-angular@^8.1.2, jest-preset-angular@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/jest-preset-angular/-/jest-preset-angular-8.2.0.tgz#270c220b4fec2a85d3b4d339d68bcf9a014c9487" - integrity sha512-UNmYGju5AVNSQdICBkGD3JhKH0jjUipY8yUQMGM1eUg8XYgFBir0uUuZd7t7Tfg0ibl95jQmvCaDIh3PUL4ySw== + version "8.2.1" + resolved "https://registry.yarnpkg.com/jest-preset-angular/-/jest-preset-angular-8.2.1.tgz#eaf5f7f6e72c1f700fbdb4c3d812976325f26d4e" + integrity sha512-6t7lavnIHnZWz6a03jpZ5L7phMefi6SoBIRZ/GQdyML8YgwMtbJszbhUE+dh5lzmeNbd6AJ1gfleetGy2Rg4cQ== dependencies: - pretty-format "^25.0.0" - ts-jest "^25.0.0" + pretty-format "^26.0.0" + ts-jest "^26.0.0" jest-regex-util@^25.2.6: version "25.2.6" @@ -8367,9 +8383,9 @@ jsprim@^1.2.2: verror "1.10.0" jsrsasign@^8.0.12: - version "8.0.16" - resolved "https://registry.yarnpkg.com/jsrsasign/-/jsrsasign-8.0.16.tgz#ca5db63dd8613624136e691f8ea68545612ace70" - integrity sha512-4yR8Bm76RKlh+qYtS7m7F1wjKB2A0R0e0VxyMy10PJNEpb/UiXKS40QmU36nuUT7Ea4/cbv4HXu1Z9c91nwLow== + version "8.0.20" + resolved "https://registry.yarnpkg.com/jsrsasign/-/jsrsasign-8.0.20.tgz#37d8029c9d8f794d8ac8d8998bce319921491f11" + integrity sha512-JTXt9+nqdynIB8wFsS6e8ffHhIjilhywXwdaEVHSj9OVmwldG2H0EoCqkQ+KXkm2tVqREfH/HEmklY4k1/6Rcg== jszip@^3.1.3: version "3.5.0" @@ -9202,12 +9218,12 @@ mkdirp-promise@^5.0.1: dependencies: mkdirp "*" -mkdirp@*, mkdirp@^1.0.3, mkdirp@^1.0.4: +mkdirp@*, mkdirp@1.x, mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1, mkdirp@~0.5.x: +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1, mkdirp@~0.5.x: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -9220,9 +9236,9 @@ modify-values@^1.0.0: integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== moment@^2.10.2: - version "2.26.0" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.26.0.tgz#5e1f82c6bafca6e83e808b30c8705eed0dcbd39a" - integrity sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw== + version "2.27.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.27.0.tgz#8bff4e3e26a236220dfe3e36de756b6ebaa0105d" + integrity sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ== move-concurrently@^1.0.1: version "1.0.1" @@ -9472,7 +9488,7 @@ node-notifier@^6.0.0: shellwords "^0.1.1" which "^1.3.1" -node-releases@^1.1.53: +node-releases@^1.1.58: version "1.1.58" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.58.tgz#8ee20eef30fa60e52755fcc0942def5a734fe935" integrity sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg== @@ -9716,9 +9732,9 @@ object-copy@^0.1.0: kind-of "^3.0.3" object-inspect@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + version "1.8.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" + integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== object-is@^1.0.1: version "1.1.2" @@ -10361,13 +10377,6 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" - integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= - dependencies: - find-up "^2.1.0" - pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" @@ -10743,7 +10752,7 @@ postcss@7.0.27: source-map "^0.6.1" supports-color "^6.1.0" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.18, postcss@^7.0.2, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.30, postcss@^7.0.5, postcss@^7.0.6: +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.18, postcss@^7.0.2, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: version "7.0.32" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== @@ -10782,7 +10791,7 @@ pretty-format@^24.3.0, pretty-format@^24.8.0: ansi-styles "^3.2.0" react-is "^16.8.4" -pretty-format@^25.0.0, pretty-format@^25.2.1, pretty-format@^25.5.0: +pretty-format@^25.2.1, pretty-format@^25.5.0: version "25.5.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== @@ -10792,6 +10801,16 @@ pretty-format@^25.0.0, pretty-format@^25.2.1, pretty-format@^25.5.0: ansi-styles "^4.0.0" react-is "^16.12.0" +pretty-format@^26.0.0: + version "26.1.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.1.0.tgz#272b9cd1f1a924ab5d443dc224899d7a65cb96ec" + integrity sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg== + dependencies: + "@jest/types" "^26.1.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -11272,11 +11291,6 @@ regenerator-runtime@0.13.5, regenerator-runtime@^0.13.4: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - regenerator-transform@^0.14.2: version "0.14.4" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" @@ -11701,9 +11715,9 @@ sass@1.26.3: chokidar ">=2.0.0 <4.0.0" sass@^1.23.0: - version "1.26.8" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.26.8.tgz#312652530721f9568d4c4000b0db07ec6eb23325" - integrity sha512-yvtzyrKLGiXQu7H12ekXqsfoGT/aTKeMDyVzCB675k1HYuaj0py63i8Uf4SI9CHXj6apDhpfwbUr3gGOjdpu2Q== + version "1.26.9" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.26.9.tgz#73c10cbb88c12b22a9e0107725bfd62296f4978f" + integrity sha512-t8AkRVi+xvba4yZiLWkJdgJHBFCB3Dh4johniQkPy9ywkgFHNasXFEFP+RG/F6LhQ+aoE4aX+IorIWQjS0esVw== dependencies: chokidar ">=2.0.0 <4.0.0" @@ -11804,11 +11818,6 @@ semver-intersect@1.4.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@6.x, semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: - version "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" @@ -11819,11 +11828,16 @@ semver@7.1.3: resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.3.tgz#e4345ce73071c53f336445cfc19efb1c311df2a6" integrity sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA== -semver@^7.0.0, semver@^7.1.1: +semver@7.x, semver@^7.0.0, semver@^7.1.1: version "7.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -12775,9 +12789,9 @@ thenify-all@^1.0.0: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": - version "3.3.0" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" - integrity sha1-5p44obq+lpsBCCB5eLn2K4hgSDk= + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== dependencies: any-promise "^1.0.0" @@ -12795,10 +12809,11 @@ through2@^2.0.0, through2@^2.0.2: xtend "~4.0.1" through2@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" - integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== + version "3.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" + integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== dependencies: + inherits "^2.0.4" readable-stream "2 || 3" through@2, "through@>=2.2.7 <3", through@X.X.X, through@^2.3.4, through@^2.3.6: @@ -12943,10 +12958,10 @@ trim-off-newlines@^1.0.0: resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= -ts-jest@^25.0.0: - version "25.5.1" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-25.5.1.tgz#2913afd08f28385d54f2f4e828be4d261f4337c7" - integrity sha512-kHEUlZMK8fn8vkxDjwbHlxXRB9dHYpyzqKIGDNxbzs+Rz+ssNDSDNusEK8Fk/sDd4xE6iKoQLfFkFVaskmTJyw== +ts-jest@^26.0.0: + version "26.1.1" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.1.1.tgz#b98569b8a4d4025d966b3d40c81986dd1c510f8d" + integrity sha512-Lk/357quLg5jJFyBQLnSbhycnB3FPe+e9i7ahxokyXxAYoB0q1pPmqxxRPYr4smJic1Rjcf7MXDBhZWgxlli0A== dependencies: bs-logger "0.x" buffer-from "1.x" @@ -12955,8 +12970,8 @@ ts-jest@^25.0.0: lodash.memoize "4.x" make-error "1.x" micromatch "4.x" - mkdirp "0.x" - semver "6.x" + mkdirp "1.x" + semver "7.x" yargs-parser "18.x" ts-node@~7.0.0: @@ -12973,12 +12988,7 @@ ts-node@~7.0.0: source-map-support "^0.5.6" yn "^2.0.0" -ts-toolbelt@^6.3.6: - version "6.9.4" - resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-6.9.4.tgz#cc3a070d99c557c552b4f69e36f13d430c47a760" - integrity sha512-muRZZqfOTOVvLk5cdnp7YWm6xX+kD/WL2cS/L4zximBRcbQSuMoTbQQ2ZZBVMs1gB0EZw1qThP+HrIQB35OmEw== - -ts-toolbelt@^6.9.9: +ts-toolbelt@^6.3.6, ts-toolbelt@^6.9.9: version "6.9.9" resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-6.9.9.tgz#e6cfd8ec7d425d2a06bda3b4fe9577ceaf2abda8" integrity sha512-5a8k6qfbrL54N4Dw+i7M6kldrbjgDWb5Vit8DnT+gwThhvqMg8KtxLE5Vmnft+geIgaSOfNJyAcnmmlflS+Vdg== @@ -13114,11 +13124,9 @@ typescript@~3.8.0: integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w== uglify-js@^3.1.4: - version "3.9.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.9.4.tgz#867402377e043c1fc7b102253a22b64e5862401b" - integrity sha512-8RZBJq5smLOa7KslsNsVcSH+KOXf1uDU8yqLeNuVKwmT0T3FA0ZoXlinQfRad7SDcbZZRZE4ov+2v71EnxNyCA== - dependencies: - commander "~2.20.3" + version "3.10.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.10.0.tgz#397a7e6e31ce820bfd1cb55b804ee140c587a9e7" + integrity sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA== uid-number@0.0.6: version "0.0.6" @@ -13867,6 +13875,11 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml@^1.7.2: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + yargs-parser@18.x, yargs-parser@^18.1.0, yargs-parser@^18.1.1, yargs-parser@^18.1.3: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" From b3eb5da2863d629fd87855276b65e00f66ccccd7 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 26 Jun 2020 10:26:28 +0300 Subject: [PATCH 083/190] chore: update @abp/utils versions --- npm/ng-packs/package.json | 2 +- npm/packs/utils/package.json | 30 +- .../utils/projects/utils/tsconfig.lib.json | 2 +- .../utils/projects/utils/tsconfig.spec.json | 2 +- npm/packs/utils/tsconfig.base.json | 24 + npm/packs/utils/tsconfig.json | 34 +- npm/packs/utils/yarn.lock | 1823 ++++++++++++----- 7 files changed, 1388 insertions(+), 529 deletions(-) create mode 100644 npm/packs/utils/tsconfig.base.json diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index 7ee57ea2bb..6cf2c9d895 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -50,7 +50,7 @@ "@angular/router": "~9.1.11", "@fortawesome/fontawesome-free": "^5.13.0", "@ng-bootstrap/ng-bootstrap": "^6.1.0", - "@ngneat/spectator": "^4.5.0", + "@ngneat/spectator": "^5.11.0", "@ngx-validate/core": "^0.0.9", "@ngxs/devtools-plugin": "^3.6.2", "@ngxs/logger-plugin": "^3.6.2", diff --git a/npm/packs/utils/package.json b/npm/packs/utils/package.json index 00807b24c2..4a37c12168 100644 --- a/npm/packs/utils/package.json +++ b/npm/packs/utils/package.json @@ -24,14 +24,14 @@ "sideEffects": false, "devDependencies": { "@angular-builders/jest": "^9.0.0", - "@angular-devkit/build-ng-packagr": "~0.901.0", - "@angular/cli": "~9.1.0", - "@angular/common": "^9.1.0", - "@angular/compiler": "~9.1.0", - "@angular/compiler-cli": "~9.1.0", - "@angular/core": "~9.1.0", - "@angular/platform-browser": "^9.1.0", - "@angular/platform-browser-dynamic": "^9.1.0", + "@angular-devkit/build-ng-packagr": "~0.1000.0", + "@angular/cli": "~10.0.0", + "@angular/common": "^10.0.0", + "@angular/compiler": "~10.0.0", + "@angular/compiler-cli": "~10.0.0", + "@angular/core": "~10.0.0", + "@angular/platform-browser": "^10.0.0", + "@angular/platform-browser-dynamic": "^10.0.0", "@types/execa": "^2.0.0", "@types/fs-extra": "^8.1.0", "@types/jest": "^25.1.4", @@ -41,19 +41,17 @@ "fs-extra": "^9.0.0", "jest": "^25.2.4", "jest-preset-angular": "^8.1.2", - "ng-packagr": "^9.0.0", - "protractor": "~5.4.3", + "ng-packagr": "^10.0.0", + "protractor": "~7.0.0", "ts-node": "~8.3.0", - "tslib": "^1.10.0", + "tslib": "^2.0.0", "tslint": "~6.1.0", - "typescript": "~3.6.0", + "typescript": "~3.9.5", "zone.js": "~0.10.2" }, - "peerDependencies": { - "tslib": "^1.10.0" - }, + "peerDependencies": {}, "dependencies": { "just-compare": "^1.3.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" -} +} \ No newline at end of file diff --git a/npm/packs/utils/projects/utils/tsconfig.lib.json b/npm/packs/utils/projects/utils/tsconfig.lib.json index 77a6628415..3335a05988 100644 --- a/npm/packs/utils/projects/utils/tsconfig.lib.json +++ b/npm/packs/utils/projects/utils/tsconfig.lib.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.json", + "extends": "../../tsconfig.base.json", "compilerOptions": { "outDir": "../../out-tsc/lib", "target": "es2015", diff --git a/npm/packs/utils/projects/utils/tsconfig.spec.json b/npm/packs/utils/projects/utils/tsconfig.spec.json index 54e55c4f05..baf37b51fe 100644 --- a/npm/packs/utils/projects/utils/tsconfig.spec.json +++ b/npm/packs/utils/projects/utils/tsconfig.spec.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.json", + "extends": "../../tsconfig.base.json", "compilerOptions": { "emitDecoratorMetadata": true, "esModuleInterop": true, diff --git a/npm/packs/utils/tsconfig.base.json b/npm/packs/utils/tsconfig.base.json new file mode 100644 index 0000000000..417625b0b0 --- /dev/null +++ b/npm/packs/utils/tsconfig.base.json @@ -0,0 +1,24 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "module": "esnext", + "moduleResolution": "node", + "importHelpers": true, + "target": "es2015", + "strictBindCallApply": true, + "lib": ["es2018", "dom"], + "paths": { + "utils": ["dist/utils/utils", "dist/utils"] + } + }, + "angularCompilerOptions": { + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true + } +} diff --git a/npm/packs/utils/tsconfig.json b/npm/packs/utils/tsconfig.json index 417625b0b0..5316c5aa4f 100644 --- a/npm/packs/utils/tsconfig.json +++ b/npm/packs/utils/tsconfig.json @@ -1,24 +1,14 @@ +/* + This is a "Solution Style" tsconfig.json file, and is used by editors and TypeScript’s language server to improve development experience. + It is not intended to be used to perform a compilation. + + To learn more about this file see: https://angular.io/config/solution-tsconfig. +*/ { - "compileOnSave": false, - "compilerOptions": { - "baseUrl": "./", - "outDir": "./dist/out-tsc", - "sourceMap": true, - "declaration": false, - "downlevelIteration": true, - "experimentalDecorators": true, - "module": "esnext", - "moduleResolution": "node", - "importHelpers": true, - "target": "es2015", - "strictBindCallApply": true, - "lib": ["es2018", "dom"], - "paths": { - "utils": ["dist/utils/utils", "dist/utils"] + "files": [], + "references": [ + { + "path": "./projects/utils/tsconfig.lib.json" } - }, - "angularCompilerOptions": { - "fullTemplateTypeCheck": true, - "strictInjectionParameters": true - } -} + ] +} \ No newline at end of file diff --git a/npm/packs/utils/yarn.lock b/npm/packs/utils/yarn.lock index e5bb5466ba..c0118807c1 100644 --- a/npm/packs/utils/yarn.lock +++ b/npm/packs/utils/yarn.lock @@ -12,13 +12,13 @@ jest-preset-angular "^8.0.0" lodash "^4.17.10" -"@angular-devkit/architect@0.901.0": - version "0.901.0" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.901.0.tgz#c660cb76e3bd35fc294d8e8578782b83157924aa" - integrity sha512-SlqEBkPrT40zMCy5344AsUqC76pEPCaGPaAkCIvadaz2dC9vNMzQrvubCPJHViD/TumkSX1kYmLS3iYASVM9GQ== +"@angular-devkit/architect@0.1000.0": + version "0.1000.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1000.0.tgz#d06639f3834bc0031aa2f8cce9cb7d490c12ae37" + integrity sha512-luzBYe7t994ebq6xIfYJudxOkMBO0bywafk6sQqb+bOaBQAran4orF1R/zEx6f8TJzEoXELjUvxm/ePSqZdpKg== dependencies: - "@angular-devkit/core" "9.1.0" - rxjs "6.5.4" + "@angular-devkit/core" "10.0.0" + rxjs "6.5.5" "@angular-devkit/architect@^0.900.0": version "0.900.7" @@ -28,13 +28,24 @@ "@angular-devkit/core" "9.0.7" rxjs "6.5.3" -"@angular-devkit/build-ng-packagr@~0.901.0": - version "0.901.0" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.901.0.tgz#48d191f49f5f1b9d5b3bc10d63b85e2c47f0de1d" - integrity sha512-cUQKK7+bYi3fOmq41cfr1ZFQwqAUUm0Yz7DgH34Ek7D98XudNOxJ63Xv4manId528WhqyGDP5/2tut7QNV3VJA== +"@angular-devkit/build-ng-packagr@~0.1000.0": + version "0.1000.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.1000.0.tgz#0aed841e3bbe10c122b7463702d838dea2420812" + integrity sha512-afYb8fGrtYyt8qoFEKqVv96tyMEf3AA0VMbyaI5w70gEGM+YkFmt66zfEsdNFojNHzOGgDvfVTjP6J4ip0Opng== dependencies: - "@angular-devkit/architect" "0.901.0" - rxjs "6.5.4" + "@angular-devkit/architect" "0.1000.0" + rxjs "6.5.5" + +"@angular-devkit/core@10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-10.0.0.tgz#9f6378a295a559d1a0bf12af200c0c9d59428a65" + integrity sha512-IvX9IMaCjDkN9vDVnYcgWbSBinlUUb7jdFhDGeTtK6rGSnjX1GoLvWneVI2hoccS07fPbnfMoYXBoZLwVxiIxw== + dependencies: + ajv "6.12.2" + fast-json-stable-stringify "2.1.0" + magic-string "0.25.7" + rxjs "6.5.5" + source-map "0.7.3" "@angular-devkit/core@9.0.7": version "9.0.7" @@ -47,7 +58,7 @@ rxjs "6.5.3" source-map "0.7.3" -"@angular-devkit/core@9.1.0", "@angular-devkit/core@^9.0.0": +"@angular-devkit/core@^9.0.0": version "9.1.0" resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-9.1.0.tgz#5cc89bb5d44c6fd12a3527bae0253adb60d64b07" integrity sha512-vHTsrB4JaVUQ95FRnKrgo79Y3F6FokImrZdrmwkQmwAThpjXeXmpUEKZS+ZSTFRgesjiIysVGOFijARP4BQ7Bg== @@ -58,50 +69,52 @@ rxjs "6.5.4" source-map "0.7.3" -"@angular-devkit/schematics@9.1.0": - version "9.1.0" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-9.1.0.tgz#f453a9ff78c34a5468cc21830ac4a46089ee1a31" - integrity sha512-cb9PSvskMwWlL54fPfCcpJoyNDWAX6Wo7CzL5qpIB2cJCPLAuyfRUYYrkO77YUST+n2HvypHz0cZ5SNGMfaaBQ== - dependencies: - "@angular-devkit/core" "9.1.0" - ora "4.0.3" - rxjs "6.5.4" - -"@angular/cli@~9.1.0": - version "9.1.0" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-9.1.0.tgz#07ec165d507208bb8d8d8ab73c3e14102643edff" - integrity sha512-ofum4gPE/W3fKyzuJrpdHeOS0ZL8x0eYCgsrMyUoFodSpb5LWPqeW+56NgDTpIeny+Trx3pM9dr9QTUVTJ0vYg== - dependencies: - "@angular-devkit/architect" "0.901.0" - "@angular-devkit/core" "9.1.0" - "@angular-devkit/schematics" "9.1.0" - "@schematics/angular" "9.1.0" - "@schematics/update" "0.901.0" +"@angular-devkit/schematics@10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-10.0.0.tgz#6ba61092621c25fef78e29c700a7fb3f523b6cc0" + integrity sha512-FJ/dY18M+cnAT9RkVjVRJ0PMFZci3ok0WoOosW25Fk68jwNSbGCeF8k8NcD6YE60+CfF4/0LxQWgFagr/wdEhw== + dependencies: + "@angular-devkit/core" "10.0.0" + ora "4.0.4" + rxjs "6.5.5" + +"@angular/cli@~10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-10.0.0.tgz#5137aeb89d5d237d09f7c6b37437b0a6e65e224a" + integrity sha512-I+2cltQCmThgrnHwsG5AX0hQ9z6rK/8ysRWWeiJXHtEtqupW9eNzXX1QfXWxWB3o6oIKgijvnLlp04BUlWCyXA== + dependencies: + "@angular-devkit/architect" "0.1000.0" + "@angular-devkit/core" "10.0.0" + "@angular-devkit/schematics" "10.0.0" + "@schematics/angular" "10.0.0" + "@schematics/update" "0.1000.0" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.1" debug "4.1.1" ini "1.3.5" inquirer "7.1.0" npm-package-arg "8.0.1" - npm-pick-manifest "6.0.0" - open "7.0.3" - pacote "11.1.4" + npm-pick-manifest "6.1.0" + open "7.0.4" + pacote "9.5.12" read-package-tree "5.3.1" rimraf "3.0.2" - semver "7.1.3" + semver "7.3.2" symbol-observable "1.2.0" universal-analytics "0.4.20" - uuid "7.0.2" + uuid "8.1.0" -"@angular/common@^9.1.0": - version "9.1.0" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-9.1.0.tgz#f9b5353a28f9da6c06266bc7244bbabf9e005176" - integrity sha512-6JPLNtMhI03bGTVQJeSwc+dTjV6DtP7M/BAyzIV0InZP1D6XsOh2QahLFIaaN2sSxYA2ClKuwfX1v+rx9AbXQA== +"@angular/common@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-10.0.0.tgz#a819dacbf3b9a3629f7e0d43a504cdd3b5fad58d" + integrity sha512-zaLHMRQqjZyoIc15tLGrwg5ugcVlggqATiMlMVNo9ddqxwpZ4qHK2fdAvqQy9FfWKaPGi6NpIBSR31RGV0ircw== + dependencies: + tslib "^2.0.0" -"@angular/compiler-cli@~9.1.0": - version "9.1.0" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-9.1.0.tgz#5887c278a2fe1f3165018b1cbceef71d9023b9ae" - integrity sha512-xZ8mVPmPporSTtvNA+cbFJQymLzuWfMX6HDDgztZ2eZ5WcQJYloRN4CcYMEzDhCxfV1Zw9Tfc2l14jZD8osi6g== +"@angular/compiler-cli@~10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-10.0.0.tgz#6fe60e239b01fd10d3923a3de88877512e0e2d40" + integrity sha512-KusRkS1NKPrjhj3BXoxRgeejuJVy/ra4dcDV3hpscRmR8FSdim3rs2H+lYK2hZ26ISGsYUvC8cHNaMqP2U3X+g== dependencies: canonical-path "1.0.0" chokidar "^3.0.0" @@ -114,27 +127,36 @@ semver "^6.3.0" source-map "^0.6.1" sourcemap-codec "^1.4.8" + tslib "^2.0.0" yargs "15.3.0" -"@angular/compiler@~9.1.0": - version "9.1.0" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-9.1.0.tgz#e55b4f2f24df75283002d5e8e85e1acfc46928f6" - integrity sha512-QHw/JSeTXHiJQ2Ih0EtU7FGsYcOr+0hwZhqwSW3EEn8TtUgA3DS5lXeiDV66f+3DdvNZFPmgiZIvun3ypxn1HA== +"@angular/compiler@~10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-10.0.0.tgz#15f0a0e5760ebc6fcbc06b0b3bb5f110282cf03d" + integrity sha512-meyJKPLLhkgjxF4dvdJq/sw7MI7KvpgYADoFt2K/5dt48ExXRj+kDlyQC6FAwm9mbgSea/A+JpDG8HMPU7AK5Q== + dependencies: + tslib "^2.0.0" -"@angular/core@~9.1.0": - version "9.1.0" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-9.1.0.tgz#9dfc386bd1461e0fd4786031fd245da04371421c" - integrity sha512-RVlyegdIAij0P1wLY5ObIdsBAzvmHkHfElnmfiNKhaDftP6U/3zRtaKDu0bq0jvn1WCQ8zXxFQ8AWyKZwyFS+w== +"@angular/core@~10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-10.0.0.tgz#b199450576f8acc0549d2836cfa04294fa3a585e" + integrity sha512-N1m6op428ktgcsnXqqspb1xGZ9gp664Jmb4JoVajCD3JXucRfidw+vt3kPOldbWA6M4pIu5ZtZY3IZc2GrK5UQ== + dependencies: + tslib "^2.0.0" -"@angular/platform-browser-dynamic@^9.1.0": - version "9.1.0" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.0.tgz#830bd5038d1875736e87e68c3aef44f0f835e418" - integrity sha512-sMtz/poQ3TYaWZzWjrn9apKUZ/WKql2MYCWbpax7pql3GgC9OoTslc7ZEe7/d3ynfFE/CQqWBBOuWGD71Z0LMQ== +"@angular/platform-browser-dynamic@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.0.0.tgz#edf99f3276fa4f13a2a533f742053286fb005354" + integrity sha512-Ol9dMU/UB8PZ1xQkcILmANC+tA1Y/6YeYc8+MYnZUH7uAMXV6kscg9C5fK9JixSldOOS05AQZAdEty9ESjFNNg== + dependencies: + tslib "^2.0.0" -"@angular/platform-browser@^9.1.0": - version "9.1.0" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-9.1.0.tgz#0bd40db37c9e314944c149de935b0f6cdd1f7350" - integrity sha512-OsS/blUjl8ranmDaRADjFAmvnlmwbT6WNU7dVov7FhV0rqesbwaOJ5bR0LSYHYpej7Jaa6oYk0v0XWkaH9LTFg== +"@angular/platform-browser@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-10.0.0.tgz#88cb200f611032c8fd2a54d3d87bda85c09f9dca" + integrity sha512-2gp53WjGUrL1uReewU21IZJa4KFpbigCyDYB0j/KwTkIGrdwYCOjD0/04oHYjkpazPe/VIu3aN7Gb3PgUa3X/Q== + dependencies: + tslib "^2.0.0" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": version "7.8.3" @@ -515,48 +537,15 @@ "@types/yargs" "^15.0.0" chalk "^3.0.0" -"@npmcli/ci-detect@^1.0.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@npmcli/ci-detect/-/ci-detect-1.2.0.tgz#0df142a1ac3bba6cbf2e9da1a6994cd898e32c95" - integrity sha512-JtktVH7ASBVIWsQTFlFpeOzhBJskvoBCTfeeRhhZy7ybATcUvwiwotZ8j5rkqUUyB69lIy/AvboiiiGBjYBKBA== - -"@npmcli/git@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-2.0.1.tgz#d7ecaa9c945de6bb1af5a7e6ea634771193c168b" - integrity sha512-hVatexiBtx71F01Ars38Hr5AFUGmJgHAfQtRlO5fJlnAawRGSXwEFgjB5i3XdUUmElZU/RXy7fefN02dZKxgPw== - dependencies: - "@npmcli/promise-spawn" "^1.1.0" - mkdirp "^1.0.3" - npm-pick-manifest "^6.0.0" - promise-inflight "^1.0.1" - promise-retry "^1.1.1" - unique-filename "^1.1.1" - which "^2.0.2" - -"@npmcli/installed-package-contents@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-1.0.5.tgz#cc78565e55d9f14d46acf46a96f70934e516fa3d" - integrity sha512-aKIwguaaqb6ViwSOFytniGvLPb9SMCUm39TgM3SfUo7n0TxUMbwoXfpwyvQ4blm10lzbAwTsvjr7QZ85LvTi4A== - dependencies: - npm-bundled "^1.1.1" - npm-normalize-package-bin "^1.0.1" - read-package-json-fast "^1.1.1" - readdir-scoped-modules "^1.1.0" - -"@npmcli/promise-spawn@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-1.1.0.tgz#660009a5c54209142ec7c469c190d212834b6087" - integrity sha512-FwbuYN9KXBkloLeIR3xRgI8dyOdfK/KzaJlChszNuwmUXD1lHXfLlSeo4n4KrKt2udIK9K9/TzlnyCA3ubM2fA== - dependencies: - infer-owner "^1.0.4" - -"@rollup/plugin-commonjs@^11.0.2": - version "11.0.2" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-11.0.2.tgz#837cc6950752327cb90177b608f0928a4e60b582" - integrity sha512-MPYGZr0qdbV5zZj8/2AuomVpnRVXRU5XKXb3HVniwRoRCreGlf5kOE081isNWeiLIi6IYkwTX9zE0/c7V8g81g== +"@rollup/plugin-commonjs@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-13.0.0.tgz#8a1d684ba6848afe8b9e3d85649d4b2f6f7217ec" + integrity sha512-Anxc3qgkAi7peAyesTqGYidG5GRim9jtg8xhmykNaZkImtvjA7Wsqep08D2mYsqw1IF7rA3lYfciLgzUSgRoqw== dependencies: - "@rollup/pluginutils" "^3.0.0" + "@rollup/pluginutils" "^3.0.8" + commondir "^1.0.1" estree-walker "^1.0.1" + glob "^7.1.2" is-reference "^1.1.2" magic-string "^0.25.2" resolve "^1.11.0" @@ -568,45 +557,56 @@ dependencies: "@rollup/pluginutils" "^3.0.4" -"@rollup/plugin-node-resolve@^7.1.0": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.1.tgz#8c6e59c4b28baf9d223028d0e450e06a485bb2b7" - integrity sha512-14ddhD7TnemeHE97a4rLOhobfYvUVcaYuqTnL8Ti7Jxi9V9Jr5LY7Gko4HZ5k4h4vqQM0gBQt6tsp9xXW94WPA== +"@rollup/plugin-node-resolve@^8.0.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.1.0.tgz#1da5f3d0ccabc8f66f5e3c74462aad76cfd96c47" + integrity sha512-ovq7ZM3JJYUUmEjjO+H8tnUdmQmdQudJB7xruX8LFZ1W2q8jXdPUS6SsIYip8ByOApu4RR7729Am9WhCeCMiHA== dependencies: - "@rollup/pluginutils" "^3.0.6" + "@rollup/pluginutils" "^3.0.8" "@types/resolve" "0.0.8" builtin-modules "^3.1.0" + deep-freeze "^0.0.1" + deepmerge "^4.2.2" is-module "^1.0.0" resolve "^1.14.2" -"@rollup/pluginutils@^3.0.0", "@rollup/pluginutils@^3.0.1", "@rollup/pluginutils@^3.0.4", "@rollup/pluginutils@^3.0.6": +"@rollup/pluginutils@^3.0.4": version "3.0.8" resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.0.8.tgz#4e94d128d94b90699e517ef045422960d18c8fde" integrity sha512-rYGeAc4sxcZ+kPG/Tw4/fwJODC3IXHYDH4qusdN/b6aLw5LPUbzpecYbEJh4sVQGPFJxd2dBU4kc1H3oy9/bnw== dependencies: estree-walker "^1.0.1" -"@schematics/angular@9.1.0": - version "9.1.0" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-9.1.0.tgz#fc0ad9099d3c3be3044d6b3f260cac6eb9f3e564" - integrity sha512-qkehaITQ1S1udfnnBY5CXGWnk1iVFI8cZayjLUlRfD5w+6v9if3VIuqPssX96MqvkbjyRu1N214+ieaawzLmuA== +"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.0.9": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@schematics/angular@10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-10.0.0.tgz#d74ec2207f1beb52c9e91c300495adb4413ed32a" + integrity sha512-m7Pxz4guAMbe7NASKCPUNxvUX/LeieDjGsXwIt09tVE4dEi9yqJP5zq8kOnZEiLKKflP7GoB65RNex4dTxsydw== dependencies: - "@angular-devkit/core" "9.1.0" - "@angular-devkit/schematics" "9.1.0" + "@angular-devkit/core" "10.0.0" + "@angular-devkit/schematics" "10.0.0" -"@schematics/update@0.901.0": - version "0.901.0" - resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.901.0.tgz#3e08231354f2c414c7d5b3bde1d9f7c08c664a74" - integrity sha512-u2VESL1dgOSGZK/wcWEz0WcCU/yv764zhzCQerCwUtbV1CISSSDZ6x+prVYDXOdxWBGtDos2MbCF3GEJJI1T+w== +"@schematics/update@0.1000.0": + version "0.1000.0" + resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.1000.0.tgz#f9f92cd8cb4da3970216782023f35db6672559ff" + integrity sha512-snjz7sQCOn4Xi66XQREXZx9K6R/vAnUfdyO5nXekls8+E+MIowlP+gqHM0whi8qJDwCLd9maYmeVsD6XZaGImQ== dependencies: - "@angular-devkit/core" "9.1.0" - "@angular-devkit/schematics" "9.1.0" + "@angular-devkit/core" "10.0.0" + "@angular-devkit/schematics" "10.0.0" "@yarnpkg/lockfile" "1.1.0" ini "1.3.5" npm-package-arg "^8.0.0" - pacote "11.1.4" - rxjs "6.5.4" - semver "7.1.3" + pacote "9.5.12" + rxjs "6.5.5" + semver "7.3.2" semver-intersect "1.4.0" "@sindresorhus/is@^0.14.0": @@ -628,11 +628,6 @@ dependencies: defer-to-connect "^1.0.1" -"@tootallnate/once@1": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.0.0.tgz#9c13c2574c92d4503b005feca8f2e16cc1611506" - integrity sha512-KYyTT/T6ALPkIRd2Ge080X/BsXvy9O0hcWTtMWkPvwAwF99+vn6Dv4GzrFT/Nn1LePr+FFDbRXXlqmsy9lw2zA== - "@types/babel__core@^7.1.0": version "7.1.6" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.6.tgz#16ff42a5ae203c9af1c6e190ed1f30f83207b610" @@ -743,6 +738,11 @@ resolved "https://registry.yarnpkg.com/@types/q/-/q-0.0.32.tgz#bd284e57c84f1325da702babfc82a5328190c0c5" integrity sha1-vShOV8hPEyXacCur/IKlMoGQwMU= +"@types/q@^1.5.1": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" + integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== + "@types/resolve@0.0.8": version "0.0.8" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" @@ -777,6 +777,14 @@ resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== +JSONStream@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + abab@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" @@ -810,36 +818,26 @@ adm-zip@^0.4.9: resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.14.tgz#2cf312bcc9f8875df835b0f6040bd89be0a727a9" integrity sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g== -agent-base@6: - version "6.0.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.0.tgz#5d0101f19bbfaed39980b22ae866de153b93f09a" - integrity sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw== - dependencies: - debug "4" - -agent-base@^4.3.0: +agent-base@4, agent-base@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== dependencies: es6-promisify "^5.0.0" -agentkeepalive@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.1.0.tgz#a48e040ed16745dd29ce923675f60c9c90f39ee0" - integrity sha512-CW/n1wxF8RpEuuiq6Vbn9S8m0VSYDMnZESqaJ6F2cWN9fY8rei2qaxweIaRgq+ek8TqfoFIsUjaGNKGGEHElSg== +agent-base@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" + integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== dependencies: - debug "^4.1.0" - depd "^1.1.2" - humanize-ms "^1.2.1" + es6-promisify "^5.0.0" -aggregate-error@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" - integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== +agentkeepalive@^3.4.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.2.tgz#a113924dd3fa24a0bc3b78108c450c2abee00f67" + integrity sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ== dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" + humanize-ms "^1.2.1" ajv@6.10.2: version "6.10.2" @@ -861,6 +859,21 @@ ajv@6.12.0, ajv@^6.10.2, ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@6.12.2: + version "6.12.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" + integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + ansi-align@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" @@ -1157,6 +1170,16 @@ blocking-proxy@^1.0.0: dependencies: minimist "^1.2.0" +bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + boxen@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" @@ -1214,6 +1237,16 @@ browser-resolve@^1.11.3: dependencies: resolve "1.1.7" +browserslist@^4.0.0: + version "4.12.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.1.tgz#6d08bef149b70d153930780ba762644e0f329122" + integrity sha512-WMjXwFtPskSW1pQUDJRxvRKRkeCr7usN0O/Za76N+F4oadaTdQHotSGcX9jT/Hs7mSKPkyMFNvqawB/1HzYDKQ== + dependencies: + caniuse-lite "^1.0.30001088" + electron-to-chromium "^1.3.481" + escalade "^3.0.1" + node-releases "^1.1.58" + browserslist@^4.11.0, browserslist@^4.7.0: version "4.11.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.11.0.tgz#aef4357b10a8abda00f97aac7cd587b2082ba1ad" @@ -1265,28 +1298,26 @@ builtins@^1.0.3: resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= -cacache@^15.0.0: - version "15.0.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.0.tgz#133b59edbd2a37ea8ef2d54964c6f247e47e5059" - integrity sha512-L0JpXHhplbJSiDGzyJJnJCTL7er7NzbBgxzVqLswEb4bO91Zbv17OUMuUeu/q0ZwKn3V+1HM4wb9tO4eVE/K8g== +cacache@^12.0.0, cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== dependencies: - chownr "^1.1.2" - fs-minipass "^2.0.0" + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" glob "^7.1.4" - infer-owner "^1.0.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" lru-cache "^5.1.1" - minipass "^3.1.1" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^1.0.3" + mississippi "^3.0.0" + mkdirp "^0.5.1" move-concurrently "^1.0.1" - p-map "^3.0.0" promise-inflight "^1.0.1" - rimraf "^2.7.1" - ssri "^8.0.0" - tar "^6.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" unique-filename "^1.1.1" + y18n "^4.0.0" cache-base@^1.0.1: version "1.0.1" @@ -1326,6 +1357,21 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001088: + version "1.0.30001088" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001088.tgz#23a6b9e192106107458528858f2c0e0dba0d9073" + integrity sha512-6eYUrlShRYveyqKG58HcyOfPgh3zb2xqs7NvT2VVtP3hEUeeWvc3lqhpeMTxYWBBeeaT9A4bKsrtjATm66BTHg== + caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001036: version "1.0.30001038" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz#44da3cbca2ab6cb6aa83d1be5d324e17f141caff" @@ -1359,7 +1405,7 @@ chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1376,6 +1422,14 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -1396,7 +1450,7 @@ chardet@^0.7.0: optionalDependencies: fsevents "~2.1.2" -chownr@^1.1.2, chownr@^1.1.3, chownr@^1.1.4: +chownr@^1.1.1, chownr@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== @@ -1416,18 +1470,6 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -clean-css@^4.1.11: - version "4.2.3" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" - integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== - dependencies: - source-map "~0.6.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - cli-boxes@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d" @@ -1481,6 +1523,15 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + codelyzer@^5.1.2: version "5.2.2" resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-5.2.2.tgz#d0530a455784e6bea0b6d7e97166c73c30a5347f" @@ -1509,7 +1560,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0: +color-convert@^1.9.0, color-convert@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -1528,11 +1579,27 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@~1.1.4: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" + integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -1545,10 +1612,15 @@ commander@^2.11.0, commander@^2.12.1, commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= component-emitter@^1.2.1: version "1.3.0" @@ -1560,6 +1632,16 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + configstore@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" @@ -1626,6 +1708,19 @@ crypto-random-string@^2.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + css-parse@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4" @@ -1633,6 +1728,21 @@ css-parse@~2.0.0: dependencies: css "^2.0.0" +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + css-selector-tokenizer@^0.7.1: version "0.7.2" resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz#11e5e27c9a48d90284f22d45061c303d7a25ad87" @@ -1642,6 +1752,27 @@ css-selector-tokenizer@^0.7.1: fastparse "^1.1.2" regexpu-core "^4.6.0" +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@1.0.0-alpha.39: + version "1.0.0-alpha.39" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" + integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== + dependencies: + mdn-data "2.0.6" + source-map "^0.6.1" + +css-what@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.3.0.tgz#10fec696a9ece2e591ac772d759aacabac38cd39" + integrity sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg== + css@^2.0.0: version "2.2.4" resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" @@ -1664,6 +1795,71 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +csso@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" + integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== + dependencies: + css-tree "1.0.0-alpha.39" + cssom@^0.4.1: version "0.4.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" @@ -1686,6 +1882,11 @@ cuint@^0.2.2: resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" integrity sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs= +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + damerau-levenshtein@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" @@ -1707,7 +1908,14 @@ data-urls@^1.1.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" -debug@4, debug@4.1.1, debug@^4.1.0, debug@^4.1.1: +debug@3.1.0, debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@4.1.1, debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -1728,13 +1936,6 @@ debug@^3.0.0, debug@^3.1.0: dependencies: ms "^2.1.1" -debug@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -1762,6 +1963,11 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +deep-freeze@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/deep-freeze/-/deep-freeze-0.0.1.tgz#3a0b0005de18672819dfd38cd31f91179c893e84" + integrity sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ= + deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -1831,11 +2037,6 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -depd@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - dependency-graph@^0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.7.2.tgz#91db9de6eb72699209d88aea4c1fd5221cac1c49" @@ -1864,6 +2065,24 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +domelementtype@1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" + integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + domexception@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" @@ -1871,6 +2090,14 @@ domexception@^1.0.1: dependencies: webidl-conversions "^4.0.2" +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + dot-prop@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" @@ -1883,6 +2110,16 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -1896,6 +2133,11 @@ electron-to-chromium@^1.3.380: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.390.tgz#a49e67dea22e52ea8027c475dd5447b1c00b1d4e" integrity sha512-4RvbM5x+002gKI8sltkqWEk5pptn0UnzekUx8RTThAMPDSb8jjpm6SwGiSnEve7f85biyZl8DMXaipaCxDjXag== +electron-to-chromium@^1.3.481: + version "1.3.483" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.483.tgz#9269e7cfc1c8e72709824da171cbe47ca5e3ca9e" + integrity sha512-+05RF8S9rk8S0G8eBCqBRBaRq7+UN3lDs2DAvnG8SBSgQO3hjy0+qt4CmRk5eiuGbTcaicgXfPmBi31a+BD3lg== + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -1906,20 +2148,25 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -encoding@^0.1.12: +encoding@^0.1.11: version "0.1.12" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= dependencies: iconv-lite "~0.4.13" -end-of-stream@^1.1.0: +end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" +entities@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" + integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== + err-code@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" @@ -1956,6 +2203,23 @@ es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: string.prototype.trimleft "^2.1.1" string.prototype.trimright "^2.1.1" +es-abstract@^1.17.2: + version "1.17.6" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" + integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.0" + is-regex "^1.1.0" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -1977,6 +2241,11 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" +escalade@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.1.tgz#52568a77443f6927cd0ab9c73129137533c965ed" + integrity sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA== + escape-goat@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" @@ -2188,6 +2457,11 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + figures@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -2232,6 +2506,14 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -2258,6 +2540,14 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + fs-extra@4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.2.tgz#f91704c53d1b461f893452b0c307d9997647ab6b" @@ -2277,12 +2567,12 @@ fs-extra@^9.0.0: jsonfile "^6.0.1" universalify "^1.0.0" -fs-minipass@^2.0.0, fs-minipass@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== +fs-minipass@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== dependencies: - minipass "^3.0.0" + minipass "^2.6.0" fs-write-stream-atomic@^1.0.8: version "1.0.10" @@ -2309,6 +2599,11 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +genfun@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" + integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA== + gensync@^1.0.0-beta.1: version "1.0.0-beta.1" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" @@ -2352,7 +2647,7 @@ glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" -glob@^7.0.3, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.3, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -2405,6 +2700,11 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" +graceful-fs@^4.1.15: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" @@ -2486,14 +2786,19 @@ has-yarn@^2.1.0: resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== -has@^1.0.3: +has@^1.0.0, has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" -hosted-git-info@^2.1.4: +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: version "2.8.8" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== @@ -2505,6 +2810,21 @@ hosted-git-info@^3.0.2: dependencies: lru-cache "^5.1.1" +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" @@ -2517,19 +2837,23 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-cache-semantics@^4.0.0, http-cache-semantics@^4.0.4: +http-cache-semantics@^3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" + integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== + +http-cache-semantics@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== +http-proxy-agent@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" + integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" + agent-base "4" + debug "3.1.0" http-signature@~1.2.0: version "1.2.0" @@ -2540,7 +2864,7 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -https-proxy-agent@^2.2.1: +https-proxy-agent@^2.2.1, https-proxy-agent@^2.2.3: version "2.2.4" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== @@ -2548,14 +2872,6 @@ https-proxy-agent@^2.2.1: agent-base "^4.3.0" debug "^3.1.0" -https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" @@ -2580,7 +2896,7 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= -ignore-walk@^3.0.3: +ignore-walk@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== @@ -2615,12 +2931,12 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= -infer-owner@^1.0.4: +infer-owner@^1.0.3, infer-owner@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== @@ -2633,7 +2949,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@~2.0.3: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -2677,6 +2993,11 @@ ip@1.1.5: resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -2696,6 +3017,11 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -2713,6 +3039,11 @@ is-callable@^1.1.4, is-callable@^1.1.5: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== +is-callable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" + integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== + is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -2720,6 +3051,18 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -2814,11 +3157,6 @@ is-interactive@^1.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== -is-lambda@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" - integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= - is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -2896,6 +3234,13 @@ is-regex@^1.0.5: dependencies: has "^1.0.3" +is-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" + integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== + dependencies: + has-symbols "^1.0.1" + is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -2906,6 +3251,13 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + is-symbol@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" @@ -3449,16 +3801,11 @@ json-buffer@3.0.0: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= -json-parse-better-errors@^1.0.1: +json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -json-parse-even-better-errors@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.2.0.tgz#304d29aa54bb01156a1328c454034ff0ac8a7bf4" - integrity sha512-2tLgY7LRNZ9Hd6gmCuBG5/OjRHQpSgJQqJoYyLLOhUgn8LdOYrjaZLcxkWnDads+AD/haWWioPNziXQcgvQJ/g== - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -3497,7 +3844,7 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsonparse@^1.3.1: +jsonparse@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= @@ -3627,7 +3974,7 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash.memoize@4.x: +lodash.memoize@4.x, lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= @@ -3637,6 +3984,11 @@ lodash.sortby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + lodash@^4.17.10, lodash@^4.17.13, lodash@^4.17.15: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" @@ -3699,26 +4051,22 @@ make-error@1.x, make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -make-fetch-happen@^8.0.2: - version "8.0.4" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-8.0.4.tgz#d3451baf5b43d6230c4eea7009c5aa6b6bccf9d4" - integrity sha512-hIFoqGq1db0QMiy/Atr/pI1Rs4rDV+ZdGSey2SQyF3KK3u1z4aj9mS5UdNnZkdQpA+H3pGn0J3KlEwsi2x4EqA== - dependencies: - agentkeepalive "^4.1.0" - cacache "^15.0.0" - http-cache-semantics "^4.0.4" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" +make-fetch-happen@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz#aa8387104f2687edca01c8687ee45013d02d19bd" + integrity sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag== + dependencies: + agentkeepalive "^3.4.1" + cacache "^12.0.0" + http-cache-semantics "^3.8.1" + http-proxy-agent "^2.1.0" + https-proxy-agent "^2.2.3" lru-cache "^5.1.1" - minipass "^3.0.0" - minipass-collect "^1.0.2" - minipass-fetch "^1.1.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" + mississippi "^3.0.0" + node-fetch-npm "^2.0.2" promise-retry "^1.1.1" - socks-proxy-agent "^5.0.0" - ssri "^8.0.0" + socks-proxy-agent "^4.0.0" + ssri "^6.0.0" makeerror@1.0.x: version "1.0.11" @@ -3739,6 +4087,16 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +mdn-data@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" + integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -3815,73 +4173,36 @@ minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-fetch@^1.1.2, minipass-fetch@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.2.1.tgz#1b97ecb559be56b09812d45b2e9509f1f59ece2f" - integrity sha512-ssHt0dkljEDaKmTgQ04DQgx2ag6G2gMPxA5hpcsoeTbfDgRf2fC2gNSRc6kISjD7ckCpHwwQvXxuTBK8402fXg== +minipass@^2.3.5, minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== dependencies: - minipass "^3.1.0" - minipass-pipeline "^1.2.2" - minipass-sized "^1.0.3" - minizlib "^2.0.0" - optionalDependencies: - encoding "^0.1.12" + safe-buffer "^5.1.2" + yallist "^3.0.0" -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== +minizlib@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== dependencies: - minipass "^3.0.0" + minipass "^2.9.0" -minipass-json-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7" - integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== dependencies: - jsonparse "^1.3.1" - minipass "^3.0.0" - -minipass-pipeline@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz#3dcb6bb4a546e32969c7ad710f2c79a86abba93a" - integrity sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA== - dependencies: - minipass "^3.0.0" - -minipass-sized@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" - integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0, minipass@^3.0.1, minipass@^3.1.0, minipass@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5" - integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w== - dependencies: - yallist "^4.0.0" - -minizlib@^2.0.0, minizlib@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.0.tgz#fd52c645301ef09a63a2c209697c294c6ce02cf3" - integrity sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" mixin-deep@^1.2.0: version "1.3.2" @@ -3891,7 +4212,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@1.x, mkdirp@^1.0.3: +mkdirp@1.x: version "1.0.3" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.3.tgz#4cf2e30ad45959dddea53ad97d518b6c8205e1ea" integrity sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g== @@ -3903,6 +4224,13 @@ mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.x: dependencies: minimist "^1.2.5" +mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -3952,32 +4280,32 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -ng-packagr@^9.0.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/ng-packagr/-/ng-packagr-9.1.0.tgz#65380bd8f05c62ee3c5f42069404fe1ca492498c" - integrity sha512-783WCTa+qQl8QQefQ3n8cDzYF3PpsQUnY87SwuXIxaJ1p8NjBq/3vCZmTiI3AXzDZFhRacbCqghtaJGU1qcFrQ== +ng-packagr@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/ng-packagr/-/ng-packagr-10.0.0.tgz#e6fd0d2e144cf92de92ba4d7d37b9da0bdb131f1" + integrity sha512-g+xrHgaF1P8URFb2JZZ4TpTD1uSN1JCHyiP3+PVUp/J8q69QRw9A8dl3JiosgbklUcVif2OnoHTpxNtLcVQ7gw== dependencies: - "@rollup/plugin-commonjs" "^11.0.2" + "@rollup/plugin-commonjs" "^13.0.0" "@rollup/plugin-json" "^4.0.0" - "@rollup/plugin-node-resolve" "^7.1.0" + "@rollup/plugin-node-resolve" "^8.0.0" ajv "^6.10.2" autoprefixer "^9.6.5" browserslist "^4.7.0" - chalk "^3.0.0" + chalk "^4.0.0" chokidar "^3.2.1" - clean-css "^4.1.11" - commander "^4.0.0" + commander "^5.0.0" + cssnano-preset-default "^4.0.7" fs-extra "^9.0.0" glob "^7.1.2" injection-js "^2.2.1" less "^3.10.3" node-sass-tilde-importer "^1.0.0" - postcss "^7.0.18" + postcss "^7.0.29" postcss-url "^8.0.0" read-pkg-up "^5.0.0" rimraf "^3.0.0" - rollup "2.2.0" - rollup-plugin-sourcemaps "^0.5.0" + rollup "^2.8.0" + rollup-plugin-sourcemaps "^0.6.0" rxjs "^6.5.0" sass "^1.23.0" stylus "^0.54.7" @@ -3989,6 +4317,15 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +node-fetch-npm@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz#6507d0e17a9ec0be3bec516958a497cec54bf5a4" + integrity sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg== + dependencies: + encoding "^0.1.11" + json-parse-better-errors "^1.0.0" + safe-buffer "^5.1.1" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -4015,6 +4352,11 @@ node-releases@^1.1.52: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.53.tgz#2d821bfa499ed7c5dffc5e2f28c88e78a08ee3f4" integrity sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ== +node-releases@^1.1.58: + version "1.1.58" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.58.tgz#8ee20eef30fa60e52755fcc0942def5a734fe935" + integrity sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg== + 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" @@ -4022,7 +4364,7 @@ node-sass-tilde-importer@^1.0.0: dependencies: find-parent-dir "^0.3.0" -normalize-package-data@^2.0.0, normalize-package-data@^2.5.0: +normalize-package-data@^2.0.0, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -4049,12 +4391,17 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + normalize-url@^4.1.0: version "4.5.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== -npm-bundled@^1.1.1: +npm-bundled@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== @@ -4073,7 +4420,7 @@ npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== -npm-package-arg@8.0.1, npm-package-arg@^8.0.0, npm-package-arg@^8.0.1: +npm-package-arg@8.0.1, npm-package-arg@^8.0.0: version "8.0.1" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.0.1.tgz#9d76f8d7667b2373ffda60bb801a27ef71e3e270" integrity sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ== @@ -4082,38 +4429,55 @@ npm-package-arg@8.0.1, npm-package-arg@^8.0.0, npm-package-arg@^8.0.1: semver "^7.0.0" validate-npm-package-name "^3.0.0" -npm-packlist@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-2.1.1.tgz#08806a1df79acdc43d02d20c83a3d5472d96c90c" - integrity sha512-95TSDvGwujIhqfSpIiRRLodEF+y6mJMopuZdahoGzqtRDFZXGav46S0p6ngeWaiAkb5R72w6eVARhzej0HvZeQ== +npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7" + integrity sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg== dependencies: - glob "^7.1.6" - ignore-walk "^3.0.3" - npm-bundled "^1.1.1" + hosted-git-info "^2.7.1" + osenv "^0.1.5" + semver "^5.6.0" + validate-npm-package-name "^3.0.0" + +npm-packlist@^1.1.12: + version "1.4.8" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" + integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" npm-normalize-package-bin "^1.0.1" -npm-pick-manifest@6.0.0, npm-pick-manifest@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-6.0.0.tgz#bfde7abe95f2670aed1629a3c18245ccb3cc2eb8" - integrity sha512-PdJpXMvjqt4nftNEDpCgjBUF8yI3Q3MyuAmVB9nemnnCg32F4BPL/JFBfdj8DubgHCYUFQhtLWmBPvdsFtjWMg== +npm-pick-manifest@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz#2befed87b0fce956790f62d32afb56d7539c022a" + integrity sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw== dependencies: npm-install-checks "^4.0.0" npm-package-arg "^8.0.0" semver "^7.0.0" -npm-registry-fetch@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-8.0.0.tgz#65bb51dd2b9634b8363019aac9c76c003e5c5eaf" - integrity sha512-975WwLvZjX97y9UWWQ8nAyr7bw02s9xKPHqvEm5T900LQsB1HXb8Gb9ebYtCBLSX+K8gSOrO5KS/9yV/naLZmQ== +npm-pick-manifest@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz#f4d9e5fd4be2153e5f4e5f9b7be8dc419a99abb7" + integrity sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw== dependencies: - "@npmcli/ci-detect" "^1.0.0" + figgy-pudding "^3.5.1" + npm-package-arg "^6.0.0" + semver "^5.4.1" + +npm-registry-fetch@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-4.0.4.tgz#2da1ecf3f43d419d96abf313664291a4623d3ea5" + integrity sha512-6jb34hX/iYNQebqWUHtU8YF6Cjb1H6ouTFPClYsyiW6lpFkljTpdeftm53rRojtja1rKAvKNIIiTS5Sjpw4wsA== + dependencies: + JSONStream "^1.3.4" + bluebird "^3.5.1" + figgy-pudding "^3.4.1" lru-cache "^5.1.1" - make-fetch-happen "^8.0.2" - minipass "^3.0.0" - minipass-fetch "^1.1.2" - minipass-json-stream "^1.0.1" - minizlib "^2.0.0" - npm-package-arg "^8.0.0" + make-fetch-happen "^5.0.0" + npm-package-arg "^6.1.0" + safe-buffer "^5.2.0" npm-run-path@^2.0.0: version "2.0.2" @@ -4129,6 +4493,13 @@ npm-run-path@^4.0.0: dependencies: path-key "^3.0.0" +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" @@ -4185,7 +4556,7 @@ object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.getownpropertydescriptors@^2.0.3: +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== @@ -4200,6 +4571,16 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" +object.values@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" + integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -4214,22 +4595,14 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" -open@7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/open/-/open-7.0.3.tgz#db551a1af9c7ab4c7af664139930826138531c48" - integrity sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA== +open@7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/open/-/open-7.0.4.tgz#c28a9d315e5c98340bf979fdcb2e58664aa10d83" + integrity sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ== dependencies: is-docker "^2.0.0" is-wsl "^2.1.1" -optimist@~0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -4242,10 +4615,10 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" -ora@4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.3.tgz#752a1b7b4be4825546a7a3d59256fa523b6b6d05" - integrity sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg== +ora@4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.4.tgz#e8da697cc5b6a47266655bf68e0fb588d29a545d" + integrity sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww== dependencies: chalk "^3.0.0" cli-cursor "^3.1.0" @@ -4256,11 +4629,24 @@ ora@4.0.3: strip-ansi "^6.0.0" wcwidth "^1.0.1" -os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= +osenv@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" @@ -4302,13 +4688,6 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -4324,40 +4703,56 @@ package-json@^6.3.0: registry-url "^5.0.0" semver "^6.2.0" -pacote@11.1.4: - version "11.1.4" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-11.1.4.tgz#5529a453c59881b7f059da8af6903b0f79c124b2" - integrity sha512-eUGJvSSpWFZKn3z8gig/HgnBmUl6gIWByIIaHzSyEr3tOWX0w8tFEADXtpu8HGv5E0ShCeTP6enRq8iHKCHSvw== - dependencies: - "@npmcli/git" "^2.0.1" - "@npmcli/installed-package-contents" "^1.0.5" - "@npmcli/promise-spawn" "^1.1.0" - cacache "^15.0.0" - chownr "^1.1.4" - fs-minipass "^2.1.0" +pacote@9.5.12: + version "9.5.12" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.5.12.tgz#1e11dd7a8d736bcc36b375a9804d41bb0377bf66" + integrity sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ== + dependencies: + bluebird "^3.5.3" + cacache "^12.0.2" + chownr "^1.1.2" + figgy-pudding "^3.5.1" + get-stream "^4.1.0" + glob "^7.1.3" infer-owner "^1.0.4" lru-cache "^5.1.1" - minipass "^3.0.1" - minipass-fetch "^1.2.1" - mkdirp "^1.0.3" - npm-package-arg "^8.0.1" - npm-packlist "^2.1.0" - npm-pick-manifest "^6.0.0" - npm-registry-fetch "^8.0.0" + make-fetch-happen "^5.0.0" + minimatch "^3.0.4" + minipass "^2.3.5" + mississippi "^3.0.0" + mkdirp "^0.5.1" + normalize-package-data "^2.4.0" + npm-normalize-package-bin "^1.0.0" + npm-package-arg "^6.1.0" + npm-packlist "^1.1.12" + npm-pick-manifest "^3.0.0" + npm-registry-fetch "^4.0.0" + osenv "^0.1.5" promise-inflight "^1.0.1" promise-retry "^1.1.1" - read-package-json-fast "^1.1.3" - rimraf "^2.7.1" - semver "^7.1.3" - ssri "^8.0.0" - tar "^6.0.1" - which "^2.0.2" + protoduck "^5.0.1" + rimraf "^2.6.2" + safe-buffer "^5.1.2" + semver "^5.6.0" + ssri "^6.0.1" + tar "^4.4.10" + unique-filename "^1.1.1" + which "^1.3.1" pako@~1.0.2: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + parse-json@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" @@ -4418,7 +4813,7 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7: +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7, picomatch@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== @@ -4471,6 +4866,271 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +postcss-calc@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.2.tgz#504efcd008ca0273120568b0792b16cdcde8aac1" + integrity sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ== + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + postcss-url@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/postcss-url/-/postcss-url-8.0.0.tgz#7b10059bd12929cdbb1971c60f61a0e5af86b4ca" @@ -4482,12 +5142,31 @@ postcss-url@^8.0.0: postcss "^7.0.2" xxhashjs "^0.2.1" +postcss-value-parser@^3.0.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + postcss-value-parser@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg== -postcss@^7.0.18, postcss@^7.0.2, postcss@^7.0.27: +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.29: + version "7.0.32" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" + integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^7.0.2, postcss@^7.0.27: version "7.0.27" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== @@ -4549,10 +5228,17 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.4" -protractor@~5.4.3: - version "5.4.3" - resolved "https://registry.yarnpkg.com/protractor/-/protractor-5.4.3.tgz#35f050741e404a45868618ea648745d89af31683" - integrity sha512-7pMAolv8Ah1yJIqaorDTzACtn3gk7BamVKPTeO5lqIGOrfosjPgXFx/z1dqSI+m5EeZc2GMJHPr5DYlodujDNA== +protoduck@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-5.0.1.tgz#03c3659ca18007b69a50fd82a7ebcc516261151f" + integrity sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg== + dependencies: + genfun "^5.0.0" + +protractor@~7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/protractor/-/protractor-7.0.0.tgz#c3e263608bd72e2c2dc802b11a772711a4792d03" + integrity sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw== dependencies: "@types/q" "^0.0.32" "@types/selenium-webdriver" "^3.0.0" @@ -4562,13 +5248,13 @@ protractor@~5.4.3: glob "^7.0.3" jasmine "2.8.0" jasminewd2 "^2.1.0" - optimist "~0.6.0" q "1.4.1" saucelabs "^1.5.0" selenium-webdriver "3.6.0" source-map-support "~0.4.0" webdriver-js-extender "2.1.0" - webdriver-manager "^12.0.6" + webdriver-manager "^12.1.7" + yargs "^15.3.1" prr@~1.0.1: version "1.0.1" @@ -4580,6 +5266,14 @@ psl@^1.1.28: resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -4588,6 +5282,15 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -4605,7 +5308,7 @@ q@1.4.1: resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" integrity sha1-VXBbzZPF82c1MMLCy8DCs63cKG4= -q@^1.4.1: +q@^1.1.2, q@^1.4.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= @@ -4630,14 +5333,6 @@ react-is@^16.12.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -read-package-json-fast@^1.1.1, read-package-json-fast@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-1.1.3.tgz#3b78464ea8f3c4447f3358635390b6946dc0737e" - integrity sha512-MmFqiyfCXV2Dmm4jH24DEGhxdkUDFivJQj4oPZQPOKywxR7HWBE6WnMWDAapfFHi3wm1b+mhR+XHlUH0CL8axg== - dependencies: - json-parse-even-better-errors "^2.0.1" - npm-normalize-package-bin "^1.0.1" - read-package-json@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.1.tgz#16aa66c59e7d4dad6288f179dd9295fd59bb98f1" @@ -4677,7 +5372,7 @@ read-pkg@^5.0.0: parse-json "^5.0.0" type-fest "^0.6.0" -"readable-stream@1 || 2", readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -4690,7 +5385,7 @@ read-pkg@^5.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readdir-scoped-modules@^1.0.0, readdir-scoped-modules@^1.1.0: +readdir-scoped-modules@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== @@ -4896,6 +5591,16 @@ retry@^0.10.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + rimraf@3.0.2, rimraf@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -4903,25 +5608,25 @@ rimraf@3.0.2, rimraf@^3.0.0: dependencies: glob "^7.1.3" -rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.7.1: +rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" -rollup-plugin-sourcemaps@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.5.0.tgz#898e8411c9b5b7b524b4d96c3b41d5c43f9da77e" - integrity sha512-xp2vvRvgnYiXydgf/JFFFgYxrqMaQaOrK/g6yZvgwT9R1TSYjD3HKku1pD7iQNjQHkl5yGpokvJLp7cP/lR+aQ== +rollup-plugin-sourcemaps@^0.6.0: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.6.2.tgz#1eed5a3e07b833dc14c4cdb1e63b300d340f4a74" + integrity sha512-9AwTKg3yRykwzemfLt71ySe0LvrAci+bpsOL1LaTYFk5BX4HF6X7DQfpHa74ANfSja3hyjiQkXCR8goSOnW//Q== dependencies: - "@rollup/pluginutils" "^3.0.1" - source-map-resolve "^0.5.3" + "@rollup/pluginutils" "^3.0.9" + source-map-resolve "^0.6.0" -rollup@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.2.0.tgz#d82cfd6eda6d9561593a7e8a2fc0b72811a89b49" - integrity sha512-iAu/j9/WJ0i+zT0sAMuQnsEbmOKzdQ4Yxu5rbPs9aUCyqveI1Kw3H4Fi9NWfCOpb8luEySD2lDyFWL9CrLE8iw== +rollup@^2.8.0: + version "2.18.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.18.0.tgz#f03801e5dd01415e5675dcf61c824ea493ca0392" + integrity sha512-LhuQQp3WpnHo3HlKCRrdMXpB6jdLsGOoXXSfMjbv74s5VdV3WZhkYJT0Z6w/EH3UgPH+g/S9T4GJrKW/5iD8TA== optionalDependencies: fsevents "~2.1.2" @@ -4958,11 +5663,23 @@ rxjs@6.5.4, rxjs@^6.5.0, rxjs@^6.5.3: dependencies: tslib "^1.9.0" +rxjs@6.5.5: + version "6.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" + integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== + dependencies: + tslib "^1.9.0" + safe-buffer@^5.0.1, safe-buffer@^5.1.2: version "5.2.0" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== +safe-buffer@^5.1.1, safe-buffer@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -5052,7 +5769,7 @@ semver-intersect@1.4.0: dependencies: semver "^5.0.0" -"semver@2 || 3 || 4 || 5", semver@^5.0.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: +"semver@2 || 3 || 4 || 5", semver@^5.0.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -5062,7 +5779,12 @@ semver@6.x, 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.1.3, semver@^7.0.0, semver@^7.1.1, semver@^7.1.3: +semver@7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + +semver@^7.0.0, semver@^7.1.1: version "7.1.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.3.tgz#e4345ce73071c53f336445cfc19efb1c311df2a6" integrity sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA== @@ -5121,6 +5843,13 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + sisteransi@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -5166,16 +5895,15 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -socks-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz#7c0f364e7b1cf4a7a437e71253bed72e9004be60" - integrity sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA== +socks-proxy-agent@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" + integrity sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg== dependencies: - agent-base "6" - debug "4" - socks "^2.3.3" + agent-base "~4.2.1" + socks "~2.3.2" -socks@^2.3.3: +socks@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.3.tgz#01129f0a5d534d2b897712ed8aceab7ee65d78e3" integrity sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA== @@ -5183,7 +5911,7 @@ socks@^2.3.3: ip "1.1.5" smart-buffer "^4.1.0" -source-map-resolve@^0.5.0, source-map-resolve@^0.5.2, source-map-resolve@^0.5.3: +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== @@ -5194,6 +5922,14 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2, source-map-resolve@^0.5.3: source-map-url "^0.4.0" urix "^0.1.0" +source-map-resolve@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" + integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + source-map-support@^0.5.6, source-map-support@~0.5.12: version "0.5.16" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" @@ -5292,12 +6028,17 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -ssri@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.0.tgz#79ca74e21f8ceaeddfcb4b90143c458b8d988808" - integrity sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA== +ssri@^6.0.0, ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== dependencies: - minipass "^3.1.1" + figgy-pudding "^3.5.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== stack-utils@^1.0.1: version "1.0.2" @@ -5317,6 +6058,19 @@ stealthy-require@^1.1.1: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + string-length@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837" @@ -5351,6 +6105,14 @@ string.prototype.trimend@^1.0.0: define-properties "^1.1.3" es-abstract "^1.17.5" +string.prototype.trimend@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" + integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trimleft@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" @@ -5377,6 +6139,14 @@ string.prototype.trimstart@^1.0.0: define-properties "^1.1.3" es-abstract "^1.17.5" +string.prototype.trimstart@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" + integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -5425,6 +6195,15 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + stylus@^0.54.7: version "0.54.7" resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.7.tgz#c6ce4793965ee538bcebe50f31537bfc04d88cd2" @@ -5473,6 +6252,25 @@ supports-hyperlinks@^2.0.0: has-flag "^4.0.0" supports-color "^7.0.0" +svgo@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + symbol-observable@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" @@ -5483,17 +6281,18 @@ symbol-tree@^3.2.2: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -tar@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.1.tgz#7b3bd6c313cb6e0153770108f8d70ac298607efa" - integrity sha512-bKhKrrz2FJJj5s7wynxy/fyxpE0CmCjmOQ1KV4KkgXFWOgoIT/NbTMnB1n+LFNrNk0SSBVGGxcK5AGsyC+pW5Q== +tar@^4.4.10: + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== dependencies: - chownr "^1.1.3" - fs-minipass "^2.0.0" - minipass "^3.0.0" - minizlib "^2.1.0" - mkdirp "^1.0.3" - yallist "^4.0.0" + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.8.6" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" term-size@^2.1.0: version "2.2.0" @@ -5531,11 +6330,24 @@ throat@^5.0.0: resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== -through@X.X.X, through@^2.3.6: +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +"through@>=2.2.7 <3", through@X.X.X, through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + tmp@0.0.30: version "0.0.30" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed" @@ -5653,6 +6465,11 @@ tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== +tslib@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.0.tgz#18d13fc2dce04051e20f074cc8387fd8089ce4f3" + integrity sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g== + tslint@~6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.0.tgz#c6c611b8ba0eed1549bf5a59ba05a7732133d851" @@ -5725,10 +6542,15 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@~3.6.0: - version "3.6.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.5.tgz#dae20114a7b4ff4bd642db9c8c699f2953e8bbdb" - integrity sha512-BEjlc0Z06ORZKbtcxGrIvvwYs5hAnuo6TKdNFL55frVDlB+na3z5bsLhFaIxmT+dPWgBIjMo6aNnTOgHHmHgiQ== +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript@~3.9.5: + version "3.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36" + integrity sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ== unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" @@ -5763,6 +6585,16 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" @@ -5803,6 +6635,11 @@ universalify@^1.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -5866,10 +6703,20 @@ util-promisify@^2.1.0: dependencies: object.getownpropertydescriptors "^2.0.3" -uuid@7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.2.tgz#7ff5c203467e91f5e0d85cfcbaaf7d2ebbca9be6" - integrity sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw== +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +uuid@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.1.0.tgz#6f1536eb43249f473abc6bd58ff983da1ca30d8d" + integrity sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg== uuid@^3.0.0, uuid@^3.3.2: version "3.4.0" @@ -5900,6 +6747,11 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -5947,7 +6799,7 @@ webdriver-js-extender@2.1.0: "@types/selenium-webdriver" "^3.0.0" selenium-webdriver "^3.0.1" -webdriver-manager@^12.0.6: +webdriver-manager@^12.1.7: version "12.1.7" resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.1.7.tgz#ed4eaee8f906b33c146e869b55e850553a1b1162" integrity sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA== @@ -6021,11 +6873,6 @@ word-wrap@~1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -6083,6 +6930,11 @@ xmlchars@^2.1.1: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== +xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + xxhashjs@^0.2.1: version "0.2.2" resolved "https://registry.yarnpkg.com/xxhashjs/-/xxhashjs-0.2.2.tgz#8a6251567621a1c46a5ae204da0249c7f8caa9d8" @@ -6095,16 +6947,11 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== -yallist@^3.0.2: +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - yargs-parser@^18.1.0, yargs-parser@^18.1.1: version "18.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.2.tgz#2f482bea2136dbde0861683abea7756d30b504f1" From 7c4d11882534dea949b8037a15d5ec125ac9ea9d Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 26 Jun 2020 10:32:14 +0300 Subject: [PATCH 084/190] chore: published the @abp/utils@3.0.0-alpha.1 --- npm/packs/utils/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/npm/packs/utils/package.json b/npm/packs/utils/package.json index 4a37c12168..820d06e625 100644 --- a/npm/packs/utils/package.json +++ b/npm/packs/utils/package.json @@ -1,6 +1,6 @@ { "name": "@abp/utils", - "version": "2.9.0", + "version": "3.0.0-alpha.1", "scripts": { "prepublish": "yarn install --ignore-scripts && node prepublish.js", "ng": "ng", @@ -54,4 +54,4 @@ "just-compare": "^1.3.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" -} \ No newline at end of file +} From ae475fd21ea358ba42e679a40fb03d522f02345e Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 26 Jun 2020 10:34:53 +0300 Subject: [PATCH 085/190] chore: update @abp/utils version in ng-packs --- npm/ng-packs/package.json | 2 +- npm/ng-packs/yarn.lock | 161 ++++++++------------------------------ 2 files changed, 32 insertions(+), 131 deletions(-) diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index 6cf2c9d895..e8f4d96f93 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -32,7 +32,7 @@ "@abp/ng.tenant-management": "~2.9.0", "@abp/ng.theme.basic": "~2.9.0", "@abp/ng.theme.shared": "~2.9.0", - "@abp/utils": "^2.9.0", + "@abp/utils": "^3.0.0-alpha.1", "@angular-builders/jest": "^9.0.1", "@angular-devkit/build-angular": "~0.901.9", "@angular-devkit/build-ng-packagr": "~0.901.9", diff --git a/npm/ng-packs/yarn.lock b/npm/ng-packs/yarn.lock index 128fac4e85..5c0888be48 100644 --- a/npm/ng-packs/yarn.lock +++ b/npm/ng-packs/yarn.lock @@ -122,13 +122,20 @@ chart.js "^2.9.3" tslib "^1.9.0" -"@abp/utils@^2.7.0", "@abp/utils@^2.9.0": +"@abp/utils@^2.7.0": version "2.9.0" resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-2.9.0.tgz#8a66b7e1d422eae5898d32af7810d6bd625276f2" integrity sha512-0gvWUH3jT7YE4ym2C45uKDzHs/oOdMW5lPq9ncCZ58wMxTrgPvxXNuMmRW0P259OcXYiRwmsNtb09/WlTQQbKA== dependencies: just-compare "^1.3.0" +"@abp/utils@^3.0.0-alpha.1": + version "3.0.0-alpha.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.0.0-alpha.1.tgz#e668c26b3ef4f5af9bf7044c28d60b94bf950227" + integrity sha512-K1FKQBcuoEO7L7F7aXmruJRvEzEA+I3l+8fYRlGB8QM1gAEZ0YO4FsJWXV4agXKVvFGkqF7Su9Ykkat7SR76Cg== + dependencies: + just-compare "^1.3.0" + "@angular-builders/jest@^9.0.1": version "9.0.1" resolved "https://registry.yarnpkg.com/@angular-builders/jest/-/jest-9.0.1.tgz#e2fcdce8f9ad3060eb8a19bdb17dc47075b8eec5" @@ -242,17 +249,6 @@ "@angular-devkit/core" "9.1.9" rxjs "6.5.4" -"@angular-devkit/core@7.3.10", "@angular-devkit/core@^7.3.6": - version "7.3.10" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.3.10.tgz#35f34b54de35c7b3ffec37dd9bc88e369ebc29ea" - integrity sha512-h8Yj2+UfBsPI7jZ8X88tImO/7RPgNWUcKF8Uq/J5eUSN6z0FMO0lluD4sM7X8aikb7RK8MwkwrqB/xfxvvkOow== - dependencies: - ajv "6.9.1" - chokidar "2.0.4" - fast-json-stable-stringify "2.0.0" - rxjs "6.3.3" - source-map "0.7.3" - "@angular-devkit/core@8.3.28", "@angular-devkit/core@^8.0.3": version "8.3.28" resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-8.3.28.tgz#0a733132821d916788a8ed34eff0f9149a9f3a15" @@ -284,14 +280,6 @@ ora "4.0.3" rxjs "6.5.4" -"@angular-devkit/schematics@^7.3.6": - version "7.3.10" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.3.10.tgz#2511595093c7d742b5d07acd40dccc6309e15817" - integrity sha512-LMTGQ8kJb80LjTttu0ZqWXddzYtDwjKtMKY9X0A60Iz8/wbGl0j+wYG7KAVoRF0JeieYXs8Dl9KWdjyJyvJ/RA== - dependencies: - "@angular-devkit/core" "7.3.10" - rxjs "6.3.3" - "@angular-devkit/schematics@^8.0.6": version "8.3.28" resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-8.3.28.tgz#80b93755e7712f838fe6a3a4a5f3f44312188a0e" @@ -2273,16 +2261,14 @@ resolved "https://registry.yarnpkg.com/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-6.1.0.tgz#fce7550a095aeac42108f76ac1ebd63caf8304e9" integrity sha512-2GzkNJBKdeHkaUqaCAqSILPft0IzzHjMfAlAuGY6/ZLlVQ0glt5MTbIXtIhSbjR+OvlrljoXFLrvzs1LGdmE+A== -"@ngneat/spectator@^4.5.0": - version "4.11.1" - resolved "https://registry.yarnpkg.com/@ngneat/spectator/-/spectator-4.11.1.tgz#0f2de4c89c29e255396177f9efa6948a2557c977" - integrity sha512-zNRTEZpG7GH6f1nRxorO5uumN3A+xA/LFjwUkB5JCRN/fWtt8aE74PWsJ2qeQPMgJCCKZRkkyZ/UksLOxXejNQ== +"@ngneat/spectator@^5.11.0": + version "5.11.0" + resolved "https://registry.yarnpkg.com/@ngneat/spectator/-/spectator-5.11.0.tgz#3b47a9e2096ac6ae511fa6d631da4da4317c67b9" + integrity sha512-OHxP410jsi5bt+tTItTtrMNfbSnXdyUwwxRwUVYHD3ZYPi2TsOTqDNpqqBZmiPJ4ZCOpPHLSgr0nkwLpYEbERA== dependencies: "@testing-library/dom" "6.1.0" - jquery "3.4.1" + jquery "3.5.0" replace-in-file "^4.1.3" - schematics-utilities "^1.1.1" - tslib "^1.9.0" "@ngtools/webpack@9.1.9": version "9.1.9" @@ -3085,16 +3071,6 @@ ajv@6.12.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@6.9.1: - version "6.9.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.9.1.tgz#a4d3683d74abc5670e75f0b16520f70a20ea8dc1" - integrity sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.5.5: version "6.12.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" @@ -3389,7 +3365,7 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== -async-each@^1.0.0, async-each@^1.0.1: +async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== @@ -3689,7 +3665,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.0, braces@^2.3.1, braces@^2.3.2: +braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -4161,26 +4137,6 @@ chartjs-color@^2.1.0: chartjs-color-string "^0.6.0" color-convert "^1.9.3" -chokidar@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" - integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.0" - braces "^2.3.0" - glob-parent "^3.1.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - lodash.debounce "^4.0.8" - normalize-path "^2.1.1" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - upath "^1.0.5" - optionalDependencies: - fsevents "^1.2.2" - "chokidar@>=2.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.0.2, chokidar@^3.2.1, chokidar@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" @@ -4544,7 +4500,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.0, concat-stream@^1.5.2: +concat-stream@^1.5.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -6421,7 +6377,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.2, fsevents@^1.2.7: +fsevents@^1.2.7: version "1.2.13" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== @@ -8237,10 +8193,10 @@ jest@^25.0.0: import-local "^3.0.2" jest-cli "^25.5.4" -jquery@3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2" - integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw== +jquery@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.0.tgz#9980b97d9e4194611c36530e7dc46a58d7340fc9" + integrity sha512-Xb7SVYMvygPxbFMpTFQiHh1J7HClEaThguL15N/Gg37Lri/qKyhRGZYzHRyLH8Stq3Aow0LsHO2O2ci86fCrNQ== js-sha256@^0.9.0: version "0.9.0" @@ -8647,11 +8603,6 @@ lodash.clonedeep@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= - lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" @@ -9508,7 +9459,7 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0, "normalize-package-data@~1.0.1 || ^2.0.0": +normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -9597,7 +9548,7 @@ npm-package-arg@8.0.1, npm-package-arg@^8.0.0: semver "^7.0.0" validate-npm-package-name "^3.0.0" -"npm-package-arg@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", "npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: +"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: version "6.1.1" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7" integrity sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg== @@ -9634,25 +9585,6 @@ npm-pick-manifest@^3.0.0: npm-package-arg "^6.0.0" semver "^5.4.1" -npm-registry-client@^8.5.1: - version "8.6.0" - resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-8.6.0.tgz#7f1529f91450732e89f8518e0f21459deea3e4c4" - integrity sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg== - dependencies: - concat-stream "^1.5.2" - graceful-fs "^4.1.6" - normalize-package-data "~1.0.1 || ^2.0.0" - npm-package-arg "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" - once "^1.3.3" - request "^2.74.0" - retry "^0.10.0" - safe-buffer "^5.1.1" - semver "2 >=2.2.1 || 3.x || 4 || 5" - slide "^1.1.3" - ssri "^5.2.4" - optionalDependencies: - npmlog "2 || ^3.1.0 || ^4.0.0" - npm-registry-fetch@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-4.0.4.tgz#2da1ecf3f43d419d96abf313664291a4623d3ea5" @@ -9680,7 +9612,7 @@ npm-run-path@^4.0.0: dependencies: path-key "^3.0.0" -"npmlog@2 || ^3.1.0 || ^4.0.0", npmlog@^4.1.2: +npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -9813,7 +9745,7 @@ on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -10215,11 +10147,6 @@ parse5@5.1.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== -parse5@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== - parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -11217,7 +11144,7 @@ readdir-scoped-modules@^1.0.0: graceful-fs "^4.1.2" once "^1.3.0" -readdirp@^2.0.0, readdirp@^2.2.1: +readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== @@ -11400,7 +11327,7 @@ request-promise-native@^1.0.7: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.74.0, request@^2.83.0, request@^2.87.0, request@^2.88.0: +request@^2.83.0, request@^2.87.0, request@^2.88.0: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -11631,13 +11558,6 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@6.3.3: - version "6.3.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" - integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw== - dependencies: - tslib "^1.9.0" - rxjs@6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" @@ -11758,18 +11678,6 @@ schema-utils@^2.5.0, schema-utils@^2.6.1, schema-utils@^2.6.4, schema-utils@^2.6 ajv "^6.12.2" ajv-keywords "^3.4.1" -schematics-utilities@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/schematics-utilities/-/schematics-utilities-1.1.3.tgz#3f78f62d31630afeafbdf0ca6ea5f41897efa236" - integrity sha512-5HnrH+MJkUmK7KfRpA457FY0BZatX2oxNts54P1347xlICCC7KjAh0r2Tue20Xfruw1mS3X5woTxa8od+JsqUA== - dependencies: - "@angular-devkit/core" "^7.3.6" - "@angular-devkit/schematics" "^7.3.6" - npm-registry-client "^8.5.1" - parse5 "^5.0.0" - rxjs "^6.4.0" - typescript "^3.3.3333" - select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" @@ -11813,7 +11721,7 @@ semver-intersect@1.4.0: dependencies: semver "^5.0.0" -"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.0.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: +"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.0.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -12002,7 +11910,7 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slide@^1.1.3, slide@^1.1.6: +slide@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= @@ -12272,13 +12180,6 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -ssri@^5.2.4: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" - integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ== - dependencies: - safe-buffer "^5.1.1" - ssri@^6.0.0, ssri@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" @@ -13113,7 +13014,7 @@ typescript@3.6.5: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.5.tgz#dae20114a7b4ff4bd642db9c8c699f2953e8bbdb" integrity sha512-BEjlc0Z06ORZKbtcxGrIvvwYs5hAnuo6TKdNFL55frVDlB+na3z5bsLhFaIxmT+dPWgBIjMo6aNnTOgHHmHgiQ== -typescript@^3.3.3333, typescript@^3.5.2: +typescript@^3.5.2: version "3.9.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36" integrity sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ== @@ -13253,7 +13154,7 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" -upath@^1.0.5, upath@^1.1.1, upath@^1.2.0: +upath@^1.1.1, upath@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== From 328fc9cc89f32a3e83406dcbcd05037a42ec0539 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 26 Jun 2020 10:42:22 +0300 Subject: [PATCH 086/190] #4497 apply DynamicStringLength for the user, identity and account modules. --- .../Volo/Abp/Account/RegisterDto.cs | 7 +++--- .../Pages/Account/Login.cshtml.cs | 4 ++-- .../Pages/Account/Manage.cshtml.cs | 18 ++++++++------- .../Pages/Account/Register.cshtml.cs | 7 +++--- .../IdentityRoleCreateOrUpdateDtoBase.cs | 3 ++- .../Abp/Identity/IdentityUserCreateDto.cs | 5 +++-- .../IdentityUserCreateOrUpdateDtoBase.cs | 11 +++++----- .../Abp/Identity/IdentityUserUpdateDto.cs | 3 ++- .../Volo/Abp/Identity/UpdateProfileDto.cs | 11 +++++----- .../Abp/Identity/IdentityClaimTypeConsts.cs | 10 ++++----- .../Abp/Identity/IdentityRoleClaimConsts.cs | 4 ++-- .../Volo/Abp/Identity/IdentityRoleConsts.cs | 6 ++--- .../Abp/Identity/IdentityUserClaimConsts.cs | 4 ++-- .../Volo/Abp/Identity/IdentityUserConsts.cs | 22 +++++++++---------- .../Abp/Identity/IdentityUserLoginConsts.cs | 6 ++--- .../Abp/Identity/IdentityUserTokenConsts.cs | 4 ++-- .../Abp/Identity/OrganizationUnitConsts.cs | 2 +- .../Identity/Roles/CreateModal.cshtml.cs | 3 ++- .../Pages/Identity/Roles/EditModal.cshtml.cs | 3 ++- .../Identity/Users/CreateModal.cshtml.cs | 13 ++++++----- .../Pages/Identity/Users/EditModal.cshtml.cs | 13 ++++++----- .../Volo/Abp/Users/AbpUserConsts.cs | 10 ++++----- 22 files changed, 91 insertions(+), 78 deletions(-) diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/RegisterDto.cs b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/RegisterDto.cs index 9a9f3caa4e..b69383d26f 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/RegisterDto.cs +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/RegisterDto.cs @@ -1,22 +1,23 @@ using System.ComponentModel.DataAnnotations; using Volo.Abp.Auditing; using Volo.Abp.Identity; +using Volo.Abp.Validation; namespace Volo.Abp.Account { public class RegisterDto { [Required] - [StringLength(IdentityUserConsts.MaxUserNameLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxUserNameLength))] public string UserName { get; set; } [Required] [EmailAddress] - [StringLength(IdentityUserConsts.MaxEmailLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxEmailLength))] public string EmailAddress { get; set; } [Required] - [StringLength(IdentityUserConsts.MaxPasswordLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPasswordLength))] [DataType(DataType.Password)] [DisableAuditing] public string Password { get; set; } diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs index 34a084bd3d..5251cb12f1 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs @@ -254,11 +254,11 @@ namespace Volo.Abp.Account.Web.Pages.Account public class LoginInputModel { [Required] - [StringLength(IdentityUserConsts.MaxEmailLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxEmailLength))] public string UserNameOrEmailAddress { get; set; } [Required] - [StringLength(IdentityUserConsts.MaxPasswordLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPasswordLength))] [DataType(DataType.Password)] [DisableAuditing] public string Password { get; set; } diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Manage.cshtml.cs b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Manage.cshtml.cs index deed56b736..3c779dc870 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Manage.cshtml.cs +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Manage.cshtml.cs @@ -2,6 +2,7 @@ using System.Threading.Tasks; using Volo.Abp.Identity; using Microsoft.AspNetCore.Mvc; +using Volo.Abp.Validation; namespace Volo.Abp.Account.Web.Pages.Account { @@ -36,44 +37,45 @@ namespace Volo.Abp.Account.Web.Pages.Account public class ChangePasswordInfoModel { [Required] - [StringLength(IdentityUserConsts.MaxPasswordLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPasswordLength))] [Display(Name = "DisplayName:CurrentPassword")] [DataType(DataType.Password)] public string CurrentPassword { get; set; } [Required] - [StringLength(IdentityUserConsts.MaxPasswordLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPasswordLength))] [Display(Name = "DisplayName:NewPassword")] [DataType(DataType.Password)] public string NewPassword { get; set; } [Required] - [StringLength(IdentityUserConsts.MaxPasswordLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPasswordLength))] [Display(Name = "DisplayName:NewPasswordConfirm")] [DataType(DataType.Password)] public string NewPasswordConfirm { get; set; } } + public class PersonalSettingsInfoModel { [Required] - [StringLength(IdentityUserConsts.MaxUserNameLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxUserNameLength))] [Display(Name = "DisplayName:UserName")] public string UserName { get; set; } [Required] - [StringLength(IdentityUserConsts.MaxEmailLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxEmailLength))] [Display(Name = "DisplayName:Email")] public string Email { get; set; } - [StringLength(IdentityUserConsts.MaxNameLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxNameLength))] [Display(Name = "DisplayName:Name")] public string Name { get; set; } - [StringLength(IdentityUserConsts.MaxSurnameLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxSurnameLength))] [Display(Name = "DisplayName:Surname")] public string Surname { get; set; } - [StringLength(IdentityUserConsts.MaxPhoneNumberLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPhoneNumberLength))] [Display(Name = "DisplayName:PhoneNumber")] public string PhoneNumber { get; set; } } diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml.cs b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml.cs index 87c7131305..f6d626dd63 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml.cs +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml.cs @@ -9,6 +9,7 @@ using Volo.Abp.Application.Dtos; using Volo.Abp.Identity; using Volo.Abp.Settings; using Volo.Abp.Uow; +using Volo.Abp.Validation; using IdentityUser = Volo.Abp.Identity.IdentityUser; namespace Volo.Abp.Account.Web.Pages.Account @@ -74,16 +75,16 @@ namespace Volo.Abp.Account.Web.Pages.Account public class PostInput { [Required] - [StringLength(IdentityUserConsts.MaxUserNameLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxUserNameLength))] public string UserName { get; set; } [Required] [EmailAddress] - [StringLength(IdentityUserConsts.MaxEmailLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxEmailLength))] public string EmailAddress { get; set; } [Required] - [StringLength(IdentityUserConsts.MaxPasswordLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPasswordLength))] [DataType(DataType.Password)] [DisableAuditing] public string Password { get; set; } diff --git a/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityRoleCreateOrUpdateDtoBase.cs b/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityRoleCreateOrUpdateDtoBase.cs index 8e11d89b30..491e82d766 100644 --- a/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityRoleCreateOrUpdateDtoBase.cs +++ b/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityRoleCreateOrUpdateDtoBase.cs @@ -1,12 +1,13 @@ using System.ComponentModel.DataAnnotations; using Volo.Abp.ObjectExtending; +using Volo.Abp.Validation; namespace Volo.Abp.Identity { public class IdentityRoleCreateOrUpdateDtoBase : ExtensibleObject { [Required] - [StringLength(IdentityRoleConsts.MaxNameLength)] + [DynamicStringLength(typeof(IdentityRoleConsts), nameof(IdentityRoleConsts.MaxNameLength))] public string Name { get; set; } public bool IsDefault { get; set; } diff --git a/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityUserCreateDto.cs b/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityUserCreateDto.cs index a572c7db2c..a080a7e33e 100644 --- a/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityUserCreateDto.cs +++ b/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityUserCreateDto.cs @@ -1,13 +1,14 @@ using System.ComponentModel.DataAnnotations; using Volo.Abp.Auditing; +using Volo.Abp.Validation; namespace Volo.Abp.Identity { public class IdentityUserCreateDto : IdentityUserCreateOrUpdateDtoBase { - [Required] - [StringLength(IdentityUserConsts.MaxPasswordLength)] [DisableAuditing] + [Required] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPasswordLength))] public string Password { get; set; } } } \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityUserCreateOrUpdateDtoBase.cs b/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityUserCreateOrUpdateDtoBase.cs index c18f2c16b5..e06ea8b987 100644 --- a/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityUserCreateOrUpdateDtoBase.cs +++ b/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityUserCreateOrUpdateDtoBase.cs @@ -2,27 +2,28 @@ using System.ComponentModel.DataAnnotations; using JetBrains.Annotations; using Volo.Abp.ObjectExtending; +using Volo.Abp.Validation; namespace Volo.Abp.Identity { public abstract class IdentityUserCreateOrUpdateDtoBase : ExtensibleObject { [Required] - [StringLength(IdentityUserConsts.MaxUserNameLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxUserNameLength))] public string UserName { get; set; } - [StringLength(IdentityUserConsts.MaxNameLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxNameLength))] public string Name { get; set; } - [StringLength(IdentityUserConsts.MaxSurnameLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxSurnameLength))] public string Surname { get; set; } [Required] [EmailAddress] - [StringLength(IdentityUserConsts.MaxEmailLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxEmailLength))] public string Email { get; set; } - [StringLength(IdentityUserConsts.MaxPhoneNumberLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPhoneNumberLength))] public string PhoneNumber { get; set; } public bool TwoFactorEnabled { get; set; } diff --git a/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityUserUpdateDto.cs b/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityUserUpdateDto.cs index 216a55df9e..aa499bf2cd 100644 --- a/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityUserUpdateDto.cs +++ b/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityUserUpdateDto.cs @@ -1,13 +1,14 @@ using System.ComponentModel.DataAnnotations; using Volo.Abp.Auditing; using Volo.Abp.Domain.Entities; +using Volo.Abp.Validation; namespace Volo.Abp.Identity { public class IdentityUserUpdateDto : IdentityUserCreateOrUpdateDtoBase, IHasConcurrencyStamp { - [StringLength(IdentityUserConsts.MaxPasswordLength)] [DisableAuditing] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPasswordLength))] public string Password { get; set; } public string ConcurrencyStamp { get; set; } diff --git a/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/UpdateProfileDto.cs b/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/UpdateProfileDto.cs index 52919c7744..5e0397bdfa 100644 --- a/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/UpdateProfileDto.cs +++ b/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/UpdateProfileDto.cs @@ -1,23 +1,24 @@ using System.ComponentModel.DataAnnotations; using Volo.Abp.ObjectExtending; +using Volo.Abp.Validation; namespace Volo.Abp.Identity { public class UpdateProfileDto : ExtensibleObject { - [StringLength(IdentityUserConsts.MaxUserNameLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxUserNameLength))] public string UserName { get; set; } - [StringLength(IdentityUserConsts.MaxEmailLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxEmailLength))] public string Email { get; set; } - [StringLength(IdentityUserConsts.MaxNameLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxNameLength))] public string Name { get; set; } - [StringLength(IdentityUserConsts.MaxSurnameLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxSurnameLength))] public string Surname { get; set; } - [StringLength(IdentityUserConsts.MaxPhoneNumberLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPhoneNumberLength))] public string PhoneNumber { get; set; } } } \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityClaimTypeConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityClaimTypeConsts.cs index 32e3197e12..6e15cb0cfc 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityClaimTypeConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityClaimTypeConsts.cs @@ -2,10 +2,10 @@ { public class IdentityClaimTypeConsts { - public const int MaxNameLength = 256; - public const int MaxRegexLength = 512; - public const int MaxRegexDescriptionLength = 128; - public const int MaxDescriptionLength = 256; - public const int MaxConcurrencyStampLength = 256; + public static int MaxNameLength { get; set; } = 256; + public static int MaxRegexLength { get; set; } = 512; + public static int MaxRegexDescriptionLength { get; set; } = 128; + public static int MaxDescriptionLength { get; set; } = 256; + public static int MaxConcurrencyStampLength { get; set; } = 256; } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityRoleClaimConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityRoleClaimConsts.cs index f53717486f..0f20ac40ef 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityRoleClaimConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityRoleClaimConsts.cs @@ -2,8 +2,8 @@ { public static class IdentityRoleClaimConsts { - public const int MaxClaimTypeLength = IdentityUserClaimConsts.MaxClaimTypeLength; + public static int MaxClaimTypeLength { get; set; } = IdentityUserClaimConsts.MaxClaimTypeLength; - public const int MaxClaimValueLength = IdentityUserClaimConsts.MaxClaimValueLength; + public static int MaxClaimValueLength { get; set; } = IdentityUserClaimConsts.MaxClaimValueLength; } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityRoleConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityRoleConsts.cs index cac33aa53d..33e8e74977 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityRoleConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityRoleConsts.cs @@ -2,8 +2,8 @@ { public static class IdentityRoleConsts { - public const int MaxNameLength = 256; - public const int MaxNormalizedNameLength = MaxNameLength; - public const int MaxConcurrencyStampLength = 256; + public static int MaxNameLength { get; set; } = 256; + public static int MaxNormalizedNameLength { get; set; } = 256; + public static int MaxConcurrencyStampLength { get; set; } = 256; } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserClaimConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserClaimConsts.cs index 025b255f11..a850d6cff2 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserClaimConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserClaimConsts.cs @@ -2,8 +2,8 @@ { public static class IdentityUserClaimConsts { - public const int MaxClaimTypeLength = 256; + public static int MaxClaimTypeLength { get; set; } = 256; - public const int MaxClaimValueLength = 1024; + public static int MaxClaimValueLength { get; set; } = 1024; } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserConsts.cs index ef2cc57ef4..7b1a90dacc 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserConsts.cs @@ -4,26 +4,26 @@ namespace Volo.Abp.Identity { public static class IdentityUserConsts { - public const int MaxUserNameLength = AbpUserConsts.MaxUserNameLength; + public static int MaxUserNameLength { get; set; } = AbpUserConsts.MaxUserNameLength; - public const int MaxNameLength = AbpUserConsts.MaxNameLength; + public static int MaxNameLength { get; set; } = AbpUserConsts.MaxNameLength; - public const int MaxSurnameLength = AbpUserConsts.MaxSurnameLength; + public static int MaxSurnameLength { get; set; } = AbpUserConsts.MaxSurnameLength; - public const int MaxNormalizedUserNameLength = MaxUserNameLength; + public static int MaxNormalizedUserNameLength { get; set; } = MaxUserNameLength; - public const int MaxEmailLength = AbpUserConsts.MaxEmailLength; + public static int MaxEmailLength { get; set; } = AbpUserConsts.MaxEmailLength; - public const int MaxNormalizedEmailLength = MaxEmailLength; + public static int MaxNormalizedEmailLength { get; set; } = MaxEmailLength; - public const int MaxPhoneNumberLength = AbpUserConsts.MaxPhoneNumberLength; + public static int MaxPhoneNumberLength { get; set; } = AbpUserConsts.MaxPhoneNumberLength; - public const int MaxPasswordLength = 128; + public static int MaxPasswordLength { get; set; } = 128; - public const int MaxPasswordHashLength = 256; + public static int MaxPasswordHashLength { get; set; } = 256; - public const int MaxSecurityStampLength = 256; + public static int MaxSecurityStampLength { get; set; } = 256; - public const int MaxConcurrencyStampLength = 256; + public static int MaxConcurrencyStampLength { get; set; } = 256; } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserLoginConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserLoginConsts.cs index 0ef43bb1b1..3f95dfd634 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserLoginConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserLoginConsts.cs @@ -2,8 +2,8 @@ { public static class IdentityUserLoginConsts { - public const int MaxLoginProviderLength = 64; - public const int MaxProviderKeyLength = 196; - public const int MaxProviderDisplayNameLength = 128; + public static int MaxLoginProviderLength { get; set; } = 64; + public static int MaxProviderKeyLength { get; set; } = 196; + public static int MaxProviderDisplayNameLength { get; set; } = 128; } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserTokenConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserTokenConsts.cs index 92305851fb..1e4eb4794b 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserTokenConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserTokenConsts.cs @@ -2,8 +2,8 @@ { public static class IdentityUserTokenConsts { - public const int MaxLoginProviderLength = 64; + public static int MaxLoginProviderLength { get; set; } = 64; - public const int MaxNameLength = 128; + public static int MaxNameLength { get; set; } = 128; } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/OrganizationUnitConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/OrganizationUnitConsts.cs index ad6091a44e..7338fc8a28 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/OrganizationUnitConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/OrganizationUnitConsts.cs @@ -5,7 +5,7 @@ /// /// Maximum length of the property. /// - public const int MaxDisplayNameLength = 128; + public static int MaxDisplayNameLength { get; set; } = 128; /// /// Maximum depth of an OU hierarchy. diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/CreateModal.cshtml.cs b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/CreateModal.cshtml.cs index e7244c80f1..df86acd94d 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/CreateModal.cshtml.cs +++ b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/CreateModal.cshtml.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using Volo.Abp.Validation; namespace Volo.Abp.Identity.Web.Pages.Identity.Roles { @@ -34,7 +35,7 @@ namespace Volo.Abp.Identity.Web.Pages.Identity.Roles public class RoleInfoModel { [Required] - [StringLength(IdentityRoleConsts.MaxNameLength)] + [DynamicStringLength(typeof(IdentityRoleConsts), nameof(IdentityRoleConsts.MaxNameLength))] [Display(Name = "DisplayName:RoleName")] public string Name { get; set; } diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/EditModal.cshtml.cs b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/EditModal.cshtml.cs index 69305d243c..8a004e95a5 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/EditModal.cshtml.cs +++ b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/EditModal.cshtml.cs @@ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Volo.Abp.Domain.Entities; +using Volo.Abp.Validation; namespace Volo.Abp.Identity.Web.Pages.Identity.Roles { @@ -44,7 +45,7 @@ namespace Volo.Abp.Identity.Web.Pages.Identity.Roles public string ConcurrencyStamp { get; set; } [Required] - [StringLength(IdentityRoleConsts.MaxNameLength)] + [DynamicStringLength(typeof(IdentityRoleConsts), nameof(IdentityRoleConsts.MaxNameLength))] [Display(Name = "DisplayName:RoleName")] public string Name { get; set; } diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/CreateModal.cshtml.cs b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/CreateModal.cshtml.cs index e7a1f4a26d..6149c676b8 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/CreateModal.cshtml.cs +++ b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/CreateModal.cshtml.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Volo.Abp.Auditing; using Volo.Abp.Application.Dtos; +using Volo.Abp.Validation; namespace Volo.Abp.Identity.Web.Pages.Identity.Users { @@ -54,27 +55,27 @@ namespace Volo.Abp.Identity.Web.Pages.Identity.Users public class UserInfoViewModel { [Required] - [StringLength(IdentityUserConsts.MaxUserNameLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxUserNameLength))] public string UserName { get; set; } - [StringLength(IdentityUserConsts.MaxNameLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxNameLength))] public string Name { get; set; } - [StringLength(IdentityUserConsts.MaxSurnameLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxSurnameLength))] public string Surname { get; set; } [Required] - [StringLength(IdentityUserConsts.MaxPasswordLength)] [DataType(DataType.Password)] [DisableAuditing] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPasswordLength))] public string Password { get; set; } [Required] [EmailAddress] - [StringLength(IdentityUserConsts.MaxEmailLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxEmailLength))] public string Email { get; set; } - [StringLength(IdentityUserConsts.MaxPhoneNumberLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPhoneNumberLength))] public string PhoneNumber { get; set; } public bool TwoFactorEnabled { get; set; } = true; diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/EditModal.cshtml.cs b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/EditModal.cshtml.cs index f14ec21fe6..08c5ae0dd9 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/EditModal.cshtml.cs +++ b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/EditModal.cshtml.cs @@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Mvc; using Volo.Abp.Auditing; using Volo.Abp.Application.Dtos; using Volo.Abp.Domain.Entities; +using Volo.Abp.Validation; namespace Volo.Abp.Identity.Web.Pages.Identity.Users { @@ -63,26 +64,26 @@ namespace Volo.Abp.Identity.Web.Pages.Identity.Users public string ConcurrencyStamp { get; set; } [Required] - [StringLength(IdentityUserConsts.MaxUserNameLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxUserNameLength))] public string UserName { get; set; } - [StringLength(IdentityUserConsts.MaxNameLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxNameLength))] public string Name { get; set; } - [StringLength(IdentityUserConsts.MaxSurnameLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxSurnameLength))] public string Surname { get; set; } - [StringLength(IdentityUserConsts.MaxPasswordLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPasswordLength))] [DataType(DataType.Password)] [DisableAuditing] public string Password { get; set; } [Required] [EmailAddress] - [StringLength(IdentityUserConsts.MaxEmailLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxEmailLength))] public string Email { get; set; } - [StringLength(IdentityUserConsts.MaxPhoneNumberLength)] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPhoneNumberLength))] public string PhoneNumber { get; set; } public bool TwoFactorEnabled { get; set; } diff --git a/modules/users/src/Volo.Abp.Users.Domain.Shared/Volo/Abp/Users/AbpUserConsts.cs b/modules/users/src/Volo.Abp.Users.Domain.Shared/Volo/Abp/Users/AbpUserConsts.cs index acfce7f37b..ee37c6c9f4 100644 --- a/modules/users/src/Volo.Abp.Users.Domain.Shared/Volo/Abp/Users/AbpUserConsts.cs +++ b/modules/users/src/Volo.Abp.Users.Domain.Shared/Volo/Abp/Users/AbpUserConsts.cs @@ -2,14 +2,14 @@ namespace Volo.Abp.Users { public class AbpUserConsts { - public const int MaxUserNameLength = 256; + public static int MaxUserNameLength { get; set; } = 256; - public const int MaxNameLength = 64; + public static int MaxNameLength { get; set; } = 64; - public const int MaxSurnameLength = 64; + public static int MaxSurnameLength { get; set; } = 64; - public const int MaxEmailLength = 256; + public static int MaxEmailLength { get; set; } = 256; - public const int MaxPhoneNumberLength = 16; + public static int MaxPhoneNumberLength { get; set; } = 16; } } \ No newline at end of file From 06aeee76d51456554e7e65f08ef92d73ccc3e51a Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 26 Jun 2020 11:02:29 +0300 Subject: [PATCH 087/190] chore: rename some files for ng update --- .../{tsconfig.lib.prod.json => tsconfig.lib.prod.temp} | 0 .../{tsconfig.lib.json => tsconfig.lib.temp} | 0 .../{tsconfig.spec.json => tsconfig.spec.temp} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename npm/ng-packs/source-code-requirements/{tsconfig.lib.prod.json => tsconfig.lib.prod.temp} (100%) rename npm/ng-packs/source-code-requirements/{tsconfig.lib.json => tsconfig.lib.temp} (100%) rename npm/ng-packs/source-code-requirements/{tsconfig.spec.json => tsconfig.spec.temp} (100%) diff --git a/npm/ng-packs/source-code-requirements/tsconfig.lib.prod.json b/npm/ng-packs/source-code-requirements/tsconfig.lib.prod.temp similarity index 100% rename from npm/ng-packs/source-code-requirements/tsconfig.lib.prod.json rename to npm/ng-packs/source-code-requirements/tsconfig.lib.prod.temp diff --git a/npm/ng-packs/source-code-requirements/tsconfig.lib.json b/npm/ng-packs/source-code-requirements/tsconfig.lib.temp similarity index 100% rename from npm/ng-packs/source-code-requirements/tsconfig.lib.json rename to npm/ng-packs/source-code-requirements/tsconfig.lib.temp diff --git a/npm/ng-packs/source-code-requirements/tsconfig.spec.json b/npm/ng-packs/source-code-requirements/tsconfig.spec.temp similarity index 100% rename from npm/ng-packs/source-code-requirements/tsconfig.spec.json rename to npm/ng-packs/source-code-requirements/tsconfig.spec.temp From 0f8925dd24b54d45daf5d68488d58dd612910b03 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 26 Jun 2020 12:28:41 +0300 Subject: [PATCH 088/190] feat: upgrade angular version of ng-packs to v10 #4494 --- .../dev-app/{browserslist => .browserslistrc} | 0 npm/ng-packs/apps/dev-app/tsconfig.dev.json | 2 +- npm/ng-packs/apps/dev-app/tsconfig.spec.json | 2 +- npm/ng-packs/package.json | 42 +- npm/ng-packs/packages/account/package.json | 3 +- npm/ng-packs/packages/core/package.json | 3 +- .../core/src/lib/services/routes.service.ts | 1 + .../packages/feature-management/package.json | 3 +- npm/ng-packs/packages/identity/package.json | 3 +- .../permission-management/package.json | 3 +- .../packages/setting-management/package.json | 3 +- .../packages/tenant-management/package.json | 3 +- .../packages/theme-basic/package.json | 3 +- .../packages/theme-shared/package.json | 3 +- npm/ng-packs/tsconfig.base.json | 38 + npm/ng-packs/tsconfig.json | 75 +- npm/ng-packs/tslint.json | 52 +- npm/ng-packs/yarn.lock | 1466 +++++++++-------- 18 files changed, 981 insertions(+), 724 deletions(-) rename npm/ng-packs/apps/dev-app/{browserslist => .browserslistrc} (100%) create mode 100644 npm/ng-packs/tsconfig.base.json diff --git a/npm/ng-packs/apps/dev-app/browserslist b/npm/ng-packs/apps/dev-app/.browserslistrc similarity index 100% rename from npm/ng-packs/apps/dev-app/browserslist rename to npm/ng-packs/apps/dev-app/.browserslistrc diff --git a/npm/ng-packs/apps/dev-app/tsconfig.dev.json b/npm/ng-packs/apps/dev-app/tsconfig.dev.json index cfbd94952d..ac0a5c3d24 100644 --- a/npm/ng-packs/apps/dev-app/tsconfig.dev.json +++ b/npm/ng-packs/apps/dev-app/tsconfig.dev.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.json", + "extends": "../../tsconfig.base.json", "compilerOptions": { "outDir": "../../out-tsc/app", "types": [] diff --git a/npm/ng-packs/apps/dev-app/tsconfig.spec.json b/npm/ng-packs/apps/dev-app/tsconfig.spec.json index e487d98612..f21e414d94 100644 --- a/npm/ng-packs/apps/dev-app/tsconfig.spec.json +++ b/npm/ng-packs/apps/dev-app/tsconfig.spec.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.json", + "extends": "../../tsconfig.base.json", "compilerOptions": { "outDir": "../../out-tsc/spec", "types": ["node", "jest"] diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index e8f4d96f93..6ea5faeeae 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -34,20 +34,20 @@ "@abp/ng.theme.shared": "~2.9.0", "@abp/utils": "^3.0.0-alpha.1", "@angular-builders/jest": "^9.0.1", - "@angular-devkit/build-angular": "~0.901.9", - "@angular-devkit/build-ng-packagr": "~0.901.9", - "@angular/animations": "~9.1.11", - "@angular/cli": "~9.1.9", - "@angular/common": "~9.1.11", - "@angular/compiler": "~9.1.11", - "@angular/compiler-cli": "~9.1.11", - "@angular/core": "~9.1.11", - "@angular/forms": "~9.1.11", - "@angular/language-service": "~9.1.11", - "@angular/localize": "~9.1.11", - "@angular/platform-browser": "~9.1.11", - "@angular/platform-browser-dynamic": "~9.1.11", - "@angular/router": "~9.1.11", + "@angular-devkit/build-angular": "~0.1000.0", + "@angular-devkit/build-ng-packagr": "~0.1000.0", + "@angular/animations": "~10.0.0", + "@angular/cli": "~10.0.0", + "@angular/common": "~10.0.0", + "@angular/compiler": "~10.0.0", + "@angular/compiler-cli": "~10.0.0", + "@angular/core": "~10.0.0", + "@angular/forms": "~10.0.0", + "@angular/language-service": "~10.0.0", + "@angular/localize": "~10.0.0", + "@angular/platform-browser": "~10.0.0", + "@angular/platform-browser-dynamic": "~10.0.0", + "@angular/router": "~10.0.0", "@fortawesome/fontawesome-free": "^5.13.0", "@ng-bootstrap/ng-bootstrap": "^6.1.0", "@ngneat/spectator": "^5.11.0", @@ -73,23 +73,23 @@ "just-clone": "^3.1.0", "just-compare": "^1.3.0", "lerna": "^3.19.0", - "ng-packagr": "^9.1.5", + "ng-packagr": "^10.0.0", "ngxs-reset-plugin": "^1.3.0", "ngxs-schematic": "^1.1.9", "prettier": "^1.18.2", - "protractor": "~5.4.0", + "protractor": "~7.0.0", "rxjs": "~6.5.4", "snq": "^1.0.3", "symlink-manager": "^1.5.0", "ts-node": "~7.0.0", "ts-toolbelt": "^6.9.9", - "tsickle": "^0.37.0", - "tslint": "~5.20.0", - "typescript": "~3.8.0", + "tsickle": "^0.38.1", + "tslint": "~6.1.0", + "typescript": "~3.9.5", "zone.js": "~0.10.2" }, "dependencies": { - "tslib": "^1.10.0" + "tslib": "^2.0.0" }, "config": { "commitizen": { @@ -99,4 +99,4 @@ "resolutions": { "@ngx-validate/core": "^0.0.8" } -} +} \ No newline at end of file diff --git a/npm/ng-packs/packages/account/package.json b/npm/ng-packs/packages/account/package.json index 254b6031a1..9f4c7942d2 100644 --- a/npm/ng-packs/packages/account/package.json +++ b/npm/ng-packs/packages/account/package.json @@ -8,7 +8,8 @@ }, "dependencies": { "@abp/ng.theme.shared": "~2.9.0" - }, + , "tslib": "^2.0.0" +}, "publishConfig": { "access": "public" } diff --git a/npm/ng-packs/packages/core/package.json b/npm/ng-packs/packages/core/package.json index 3a8b9236a1..5566fb9750 100644 --- a/npm/ng-packs/packages/core/package.json +++ b/npm/ng-packs/packages/core/package.json @@ -16,7 +16,8 @@ "just-clone": "^3.1.0", "just-compare": "^1.3.0", "snq": "^1.0.3", - "ts-toolbelt": "^6.9.9" + "ts-toolbelt": "^6.9.9", + "tslib": "^2.0.0" }, "publishConfig": { "access": "public" diff --git a/npm/ng-packs/packages/core/src/lib/services/routes.service.ts b/npm/ng-packs/packages/core/src/lib/services/routes.service.ts index 7257a50ff3..2324f09c0b 100644 --- a/npm/ng-packs/packages/core/src/lib/services/routes.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/routes.service.ts @@ -126,6 +126,7 @@ export abstract class AbstractTreeService { } } +@Injectable() export abstract class AbstractNavTreeService extends AbstractTreeService implements OnDestroy { readonly id = 'name'; diff --git a/npm/ng-packs/packages/feature-management/package.json b/npm/ng-packs/packages/feature-management/package.json index fd1816df45..e2550bf15a 100644 --- a/npm/ng-packs/packages/feature-management/package.json +++ b/npm/ng-packs/packages/feature-management/package.json @@ -7,7 +7,8 @@ "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~2.9.0" + "@abp/ng.theme.shared": "~2.9.0", + "tslib": "^2.0.0" }, "publishConfig": { "access": "public" diff --git a/npm/ng-packs/packages/identity/package.json b/npm/ng-packs/packages/identity/package.json index 38ec9cd9d9..553b5518e9 100644 --- a/npm/ng-packs/packages/identity/package.json +++ b/npm/ng-packs/packages/identity/package.json @@ -8,7 +8,8 @@ }, "dependencies": { "@abp/ng.permission-management": "~2.9.0", - "@abp/ng.theme.shared": "~2.9.0" + "@abp/ng.theme.shared": "~2.9.0", + "tslib": "^2.0.0" }, "publishConfig": { "access": "public" diff --git a/npm/ng-packs/packages/permission-management/package.json b/npm/ng-packs/packages/permission-management/package.json index a09d4c7f8e..1bc7859bcf 100644 --- a/npm/ng-packs/packages/permission-management/package.json +++ b/npm/ng-packs/packages/permission-management/package.json @@ -7,7 +7,8 @@ "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~2.9.0" + "@abp/ng.theme.shared": "~2.9.0", + "tslib": "^2.0.0" }, "publishConfig": { "access": "public" diff --git a/npm/ng-packs/packages/setting-management/package.json b/npm/ng-packs/packages/setting-management/package.json index 969510305e..a6fb57ce18 100644 --- a/npm/ng-packs/packages/setting-management/package.json +++ b/npm/ng-packs/packages/setting-management/package.json @@ -7,7 +7,8 @@ "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~2.9.0" + "@abp/ng.theme.shared": "~2.9.0", + "tslib": "^2.0.0" }, "publishConfig": { "access": "public" diff --git a/npm/ng-packs/packages/tenant-management/package.json b/npm/ng-packs/packages/tenant-management/package.json index 0921e0dd9e..e8fd10094e 100644 --- a/npm/ng-packs/packages/tenant-management/package.json +++ b/npm/ng-packs/packages/tenant-management/package.json @@ -8,7 +8,8 @@ }, "dependencies": { "@abp/ng.feature-management": "~2.9.0", - "@abp/ng.theme.shared": "~2.9.0" + "@abp/ng.theme.shared": "~2.9.0", + "tslib": "^2.0.0" }, "publishConfig": { "access": "public" diff --git a/npm/ng-packs/packages/theme-basic/package.json b/npm/ng-packs/packages/theme-basic/package.json index c7e3275e91..9307b1e21e 100644 --- a/npm/ng-packs/packages/theme-basic/package.json +++ b/npm/ng-packs/packages/theme-basic/package.json @@ -8,7 +8,8 @@ }, "dependencies": { "@abp/ng.theme.shared": "~2.9.0" - }, + , "tslib": "^2.0.0" +}, "publishConfig": { "access": "public" } diff --git a/npm/ng-packs/packages/theme-shared/package.json b/npm/ng-packs/packages/theme-shared/package.json index e85744e04f..03f3491837 100644 --- a/npm/ng-packs/packages/theme-shared/package.json +++ b/npm/ng-packs/packages/theme-shared/package.json @@ -13,7 +13,8 @@ "@ngx-validate/core": "^0.0.9", "@swimlane/ngx-datatable": "^17.0.0", "bootstrap": "^4.5.0", - "chart.js": "^2.9.3" + "chart.js": "^2.9.3", + "tslib": "^2.0.0" }, "publishConfig": { "access": "public" diff --git a/npm/ng-packs/tsconfig.base.json b/npm/ng-packs/tsconfig.base.json new file mode 100644 index 0000000000..02971ebe83 --- /dev/null +++ b/npm/ng-packs/tsconfig.base.json @@ -0,0 +1,38 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "module": "esnext", + "moduleResolution": "node", + "importHelpers": true, + "target": "es2015", + "typeRoots": ["node_modules/@types"], + "lib": ["es2018", "dom"], + "types": ["jest"], + "paths": { + "@abp/ng.core": ["packages/core/src/public-api.ts"], + "@abp/ng.theme.shared": ["packages/theme-shared/src/public-api.ts"], + "@abp/ng.theme.shared/extensions": ["packages/theme-shared/src/public-api.ts"], + "@abp/ng.theme.basic": ["packages/theme-basic/src/public-api.ts"], + "@abp/ng.account": ["packages/account/src/public-api.ts"], + "@abp/ng.account/config": ["packages/account/config/src/public-api.ts"], + "@abp/ng.identity": ["packages/identity/src/public-api.ts"], + "@abp/ng.identity/config": ["packages/identity/config/src/public-api.ts"], + "@abp/ng.tenant-management": ["packages/tenant-management/src/public-api.ts"], + "@abp/ng.tenant-management/config": ["packages/tenant-management/config/src/public-api.ts"], + "@abp/ng.setting-management": ["packages/setting-management/src/public-api.ts"], + "@abp/ng.setting-management/config": ["packages/setting-management/config/src/public-api.ts"], + "@abp/ng.permission-management": ["packages/permission-management/src/public-api.ts"], + "@abp/ng.feature-management": ["packages/feature-management/src/public-api.ts"] + } + }, + "angularCompilerOptions": { + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true + } +} diff --git a/npm/ng-packs/tsconfig.json b/npm/ng-packs/tsconfig.json index 02971ebe83..4cf2a80ee8 100644 --- a/npm/ng-packs/tsconfig.json +++ b/npm/ng-packs/tsconfig.json @@ -1,38 +1,41 @@ +/* + This is a "Solution Style" tsconfig.json file, and is used by editors and TypeScript’s language server to improve development experience. + It is not intended to be used to perform a compilation. + + To learn more about this file see: https://angular.io/config/solution-tsconfig. +*/ { - "compileOnSave": false, - "compilerOptions": { - "baseUrl": "./", - "outDir": "./dist/out-tsc", - "sourceMap": true, - "declaration": false, - "downlevelIteration": true, - "experimentalDecorators": true, - "module": "esnext", - "moduleResolution": "node", - "importHelpers": true, - "target": "es2015", - "typeRoots": ["node_modules/@types"], - "lib": ["es2018", "dom"], - "types": ["jest"], - "paths": { - "@abp/ng.core": ["packages/core/src/public-api.ts"], - "@abp/ng.theme.shared": ["packages/theme-shared/src/public-api.ts"], - "@abp/ng.theme.shared/extensions": ["packages/theme-shared/src/public-api.ts"], - "@abp/ng.theme.basic": ["packages/theme-basic/src/public-api.ts"], - "@abp/ng.account": ["packages/account/src/public-api.ts"], - "@abp/ng.account/config": ["packages/account/config/src/public-api.ts"], - "@abp/ng.identity": ["packages/identity/src/public-api.ts"], - "@abp/ng.identity/config": ["packages/identity/config/src/public-api.ts"], - "@abp/ng.tenant-management": ["packages/tenant-management/src/public-api.ts"], - "@abp/ng.tenant-management/config": ["packages/tenant-management/config/src/public-api.ts"], - "@abp/ng.setting-management": ["packages/setting-management/src/public-api.ts"], - "@abp/ng.setting-management/config": ["packages/setting-management/config/src/public-api.ts"], - "@abp/ng.permission-management": ["packages/permission-management/src/public-api.ts"], - "@abp/ng.feature-management": ["packages/feature-management/src/public-api.ts"] + "files": [], + "references": [ + { + "path": "./packages/core/tsconfig.lib.json" + }, + { + "path": "./packages/theme-shared/tsconfig.lib.json" + }, + { + "path": "./packages/theme-basic/tsconfig.lib.json" + }, + { + "path": "./packages/account/tsconfig.lib.json" + }, + { + "path": "./packages/permission-management/tsconfig.lib.json" + }, + { + "path": "./packages/identity/tsconfig.lib.json" + }, + { + "path": "./packages/feature-management/tsconfig.lib.json" + }, + { + "path": "./packages/tenant-management/tsconfig.lib.json" + }, + { + "path": "./packages/setting-management/tsconfig.lib.json" + }, + { + "path": "./apps/dev-app/tsconfig.dev.json" } - }, - "angularCompilerOptions": { - "fullTemplateTypeCheck": true, - "strictInjectionParameters": true - } -} + ] +} \ No newline at end of file diff --git a/npm/ng-packs/tslint.json b/npm/ng-packs/tslint.json index 5a5d15bc35..dc5de80dab 100644 --- a/npm/ng-packs/tslint.json +++ b/npm/ng-packs/tslint.json @@ -2,16 +2,38 @@ "extends": "tslint:recommended", "rulesDirectory": ["node_modules/codelyzer"], "rules": { + "align": { + "options": [ + "parameters", + "statements" + ] + }, "array-type": false, "contextual-lifecycle": true, "component-class-suffix": [true, "Component"], "directive-class-suffix": [true, "Directive"], + "eofline": true, + "import-spacing": true, + "indent": { + "options": [ + "spaces" + ] + }, "max-line-length": [true, 140], "no-consecutive-blank-lines": false, "no-redundant-jsdoc": true, "no-var-requires": false, "object-literal-key-quotes": [true, "as-needed"], "ordered-imports": false, + "space-before-function-paren": { + "options": { + "anonymous": "never", + "asyncArrow": "always", + "constructor": "never", + "method": "never", + "named": "never" + } + }, "trailing-comma": false, "component-max-inline-declarations": [true, { "animations": 20, "styles": 20, "template": 20 }], "no-forward-ref": true, @@ -21,6 +43,24 @@ "no-unused-css": true, "prefer-output-readonly": true, "template-conditional-complexity": [true, 4], + "typedef-whitespace": { + "options": [ + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + }, + { + "call-signature": "onespace", + "index-signature": "onespace", + "parameter": "onespace", + "property-declaration": "onespace", + "variable-declaration": "onespace" + } + ] + }, "use-component-selector": true, "max-classes-per-file": false, "arrow-parens": false, @@ -96,5 +136,15 @@ "use-pipe-transform-interface": true, "variable-name": false, "prefer-for-of": false - } + , "whitespace": { + "options": [ + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type", + "check-typecast" + ] + } +} } diff --git a/npm/ng-packs/yarn.lock b/npm/ng-packs/yarn.lock index 5c0888be48..9d8d98d475 100644 --- a/npm/ng-packs/yarn.lock +++ b/npm/ng-packs/yarn.lock @@ -146,7 +146,15 @@ jest-preset-angular "^8.1.2" lodash "^4.17.10" -"@angular-devkit/architect@0.901.9", "@angular-devkit/architect@>=0.900.0 < 0.1000.0": +"@angular-devkit/architect@0.1000.0": + version "0.1000.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1000.0.tgz#d06639f3834bc0031aa2f8cce9cb7d490c12ae37" + integrity sha512-luzBYe7t994ebq6xIfYJudxOkMBO0bywafk6sQqb+bOaBQAran4orF1R/zEx6f8TJzEoXELjUvxm/ePSqZdpKg== + dependencies: + "@angular-devkit/core" "10.0.0" + rxjs "6.5.5" + +"@angular-devkit/architect@>=0.900.0 < 0.1000.0": version "0.901.9" resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.901.9.tgz#5d849a120449b2f91ec6eef44ddad74ffb7ad810" integrity sha512-Xokyh7bv4qICHpb5Xui1jPTi6ZZvzR5tbTIxT0DFWqw16TEkFgkNubQsW6mFSR3g3CXdySMfOwWExfa/rE1ggA== @@ -154,100 +162,114 @@ "@angular-devkit/core" "9.1.9" rxjs "6.5.4" -"@angular-devkit/build-angular@~0.901.9": - version "0.901.9" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.901.9.tgz#a60c41497e69d663cf2c74778cc72dd262cc09a1" - integrity sha512-eC6iZQR5tr9dz/SkR3/3Y8Fau/2IzEfHlFCf2mqsOLkbc0MWyM/3RcuZQhRGdVOyzDCIbfzJGY0N3ejkEn2EUg== - dependencies: - "@angular-devkit/architect" "0.901.9" - "@angular-devkit/build-optimizer" "0.901.9" - "@angular-devkit/build-webpack" "0.901.9" - "@angular-devkit/core" "9.1.9" - "@babel/core" "7.9.0" - "@babel/generator" "7.9.3" - "@babel/preset-env" "7.9.0" +"@angular-devkit/build-angular@~0.1000.0": + version "0.1000.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.1000.0.tgz#7325e49537c772003434c7db0426af779a9c8d66" + integrity sha512-bU3Xq0evtX1xqD0KSY1lSwDQkz82AKZSKFv7fq+OL6+xrALG5DTtZq2SBwpTsy5AQ/Aq027GX2eMTrczWzQ4KA== + dependencies: + "@angular-devkit/architect" "0.1000.0" + "@angular-devkit/build-optimizer" "0.1000.0" + "@angular-devkit/build-webpack" "0.1000.0" + "@angular-devkit/core" "10.0.0" + "@babel/core" "7.9.6" + "@babel/generator" "7.9.6" + "@babel/plugin-transform-runtime" "7.9.6" + "@babel/preset-env" "7.9.6" + "@babel/runtime" "7.9.6" "@babel/template" "7.8.6" "@jsdevtools/coverage-istanbul-loader" "3.0.3" - "@ngtools/webpack" "9.1.9" - ajv "6.12.0" - autoprefixer "9.7.4" - babel-loader "8.0.6" + "@ngtools/webpack" "10.0.0" + ajv "6.12.2" + autoprefixer "9.8.0" + babel-loader "8.1.0" browserslist "^4.9.1" - cacache "15.0.0" + cacache "15.0.3" caniuse-lite "^1.0.30001032" circular-dependency-plugin "5.2.0" copy-webpack-plugin "6.0.2" core-js "3.6.4" - css-loader "3.5.1" + css-loader "3.5.3" cssnano "4.1.10" file-loader "6.0.0" find-cache-dir "3.3.1" glob "7.1.6" - jest-worker "25.1.0" + jest-worker "26.0.0" karma-source-map-support "1.4.0" - less "3.11.3" - less-loader "5.0.0" - license-webpack-plugin "2.1.4" + less-loader "6.1.0" + license-webpack-plugin "2.2.0" loader-utils "2.0.0" mini-css-extract-plugin "0.9.0" minimatch "3.0.4" - open "7.0.3" + open "7.0.4" parse5 "4.0.0" - postcss "7.0.27" + pnp-webpack-plugin "1.6.4" + postcss "7.0.31" postcss-import "12.0.1" postcss-loader "3.0.0" - raw-loader "4.0.0" + raw-loader "4.0.1" regenerator-runtime "0.13.5" + resolve-url-loader "3.1.1" rimraf "3.0.2" - rollup "2.1.0" - rxjs "6.5.4" - sass "1.26.3" + rollup "2.10.9" + rxjs "6.5.5" + sass "1.26.5" sass-loader "8.0.2" - semver "7.1.3" + semver "7.3.2" source-map "0.7.3" - source-map-loader "0.2.4" - speed-measure-webpack-plugin "1.3.1" - style-loader "1.1.3" + source-map-loader "1.0.0" + source-map-support "0.5.19" + speed-measure-webpack-plugin "1.3.3" + style-loader "1.2.1" stylus "0.54.7" stylus-loader "3.0.2" - terser "4.6.10" - terser-webpack-plugin "3.0.3" + terser "4.7.0" + terser-webpack-plugin "3.0.1" tree-kill "1.2.2" - webpack "4.42.0" + webpack "4.43.0" webpack-dev-middleware "3.7.2" webpack-dev-server "3.11.0" webpack-merge "4.2.2" webpack-sources "1.4.3" - webpack-subresource-integrity "1.4.0" + webpack-subresource-integrity "1.4.1" worker-plugin "4.0.3" -"@angular-devkit/build-ng-packagr@~0.901.9": - version "0.901.9" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.901.9.tgz#ade174940ab11da292a773a2b8149f9c6f5e78c3" - integrity sha512-tZvRAJcBSvYEPcwRRdXtpklS/7pf5Y5QvsTuK34MiVZD7T/fBwMtIqGhIq3o0uxVqBnQdpBFxoRgE3DL1AdY7g== +"@angular-devkit/build-ng-packagr@~0.1000.0": + version "0.1000.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.1000.0.tgz#0aed841e3bbe10c122b7463702d838dea2420812" + integrity sha512-afYb8fGrtYyt8qoFEKqVv96tyMEf3AA0VMbyaI5w70gEGM+YkFmt66zfEsdNFojNHzOGgDvfVTjP6J4ip0Opng== dependencies: - "@angular-devkit/architect" "0.901.9" - rxjs "6.5.4" + "@angular-devkit/architect" "0.1000.0" + rxjs "6.5.5" -"@angular-devkit/build-optimizer@0.901.9": - version "0.901.9" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.901.9.tgz#c8018de2406c8bbf32bf74cdacd6fa1df384a8d0" - integrity sha512-AcDhE7RHmaVEaDB02MHp1PR2gdUg3+G/12pDC3GeAlfP1GD/sVBpcqPL6DHFp0dMm/FsvSfVSaXpzD7jZBeIKQ== +"@angular-devkit/build-optimizer@0.1000.0": + version "0.1000.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.1000.0.tgz#0a38dca8e574d501240e9b5b4440690e58a3dfd4" + integrity sha512-WrC/PX/ORAoqKP6FsrWsmzfic0mHyLAZ6XgNNr3RY4xxvBe4+K7FGoG+PaIwD4tILvO6QwwJ1wwBbnGIqQLIHA== dependencies: loader-utils "2.0.0" source-map "0.7.3" - tslib "1.11.1" - typescript "3.6.5" + tslib "2.0.0" webpack-sources "1.4.3" -"@angular-devkit/build-webpack@0.901.9": - version "0.901.9" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.901.9.tgz#19e783950b2f22ceaa0c33b07552bd225dcd412b" - integrity sha512-Bha9LruitixhtJm72FGzqfDfgsOsrMT3EbNSql2muyoELIYbLDOvNZjcDD06CPcOAWSg6/tH9caOTFS2Zj9yOw== +"@angular-devkit/build-webpack@0.1000.0": + version "0.1000.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1000.0.tgz#ea9c8df00231e1af56e1c37b305ff1108020f25c" + integrity sha512-5SGcc9YzGK1DQ3/2/gOnVpJIwmOvywE9OB/J7IFR1uRYxQ4fSdOZvHZJ4DvqwfFExGIFeSBnfxIs8nefT+s8Nw== dependencies: - "@angular-devkit/architect" "0.901.9" - "@angular-devkit/core" "9.1.9" - rxjs "6.5.4" + "@angular-devkit/architect" "0.1000.0" + "@angular-devkit/core" "10.0.0" + rxjs "6.5.5" + +"@angular-devkit/core@10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-10.0.0.tgz#9f6378a295a559d1a0bf12af200c0c9d59428a65" + integrity sha512-IvX9IMaCjDkN9vDVnYcgWbSBinlUUb7jdFhDGeTtK6rGSnjX1GoLvWneVI2hoccS07fPbnfMoYXBoZLwVxiIxw== + dependencies: + ajv "6.12.2" + fast-json-stable-stringify "2.1.0" + magic-string "0.25.7" + rxjs "6.5.5" + source-map "0.7.3" "@angular-devkit/core@8.3.28", "@angular-devkit/core@^8.0.3": version "8.3.28" @@ -271,14 +293,14 @@ rxjs "6.5.4" source-map "0.7.3" -"@angular-devkit/schematics@9.1.9": - version "9.1.9" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-9.1.9.tgz#1369ee586cb91ffebf12673bb839d31ad5c00357" - integrity sha512-aKuMmS3wshOTl9+01jiB50ml09fRN1WfOOtoNqwvKTEi87DrT6Mn3l0eVQo8PJK/bIq/FBmPgsIl2nsETiBSxg== +"@angular-devkit/schematics@10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-10.0.0.tgz#6ba61092621c25fef78e29c700a7fb3f523b6cc0" + integrity sha512-FJ/dY18M+cnAT9RkVjVRJ0PMFZci3ok0WoOosW25Fk68jwNSbGCeF8k8NcD6YE60+CfF4/0LxQWgFagr/wdEhw== dependencies: - "@angular-devkit/core" "9.1.9" - ora "4.0.3" - rxjs "6.5.4" + "@angular-devkit/core" "10.0.0" + ora "4.0.4" + rxjs "6.5.5" "@angular-devkit/schematics@^8.0.6": version "8.3.28" @@ -288,46 +310,50 @@ "@angular-devkit/core" "8.3.28" rxjs "6.4.0" -"@angular/animations@~9.1.11": - version "9.1.11" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-9.1.11.tgz#2c7b6e584df0ba0884d05f01fa7ab86c1fdd1c5e" - integrity sha512-VKAExUnEJfo1PDQKagpx2pn+QMZCsPLRiADzTdl4U0VPylK3ALbn4ZNY9UbdwyE2plitz++LkH7sEGGfh+PNrQ== +"@angular/animations@~10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-10.0.0.tgz#a778f04584c93e7fb121ce5580e86ef0f6bc6dfe" + integrity sha512-L6xnrqSZxAqznx5so3J7jGtZGu44rXtH9R98HFUBQWM596ZY0Pf1i08c1hThuC0b0Yn8WeddQwU6HkstbX4Cmg== + dependencies: + tslib "^2.0.0" -"@angular/cli@~9.1.9": - version "9.1.9" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-9.1.9.tgz#e9caced7c107c65075fe1b4c42a4712a5aeb992c" - integrity sha512-k8C0OY3oHoixd3buCgF8+VFe8YZGSGiprnbVMEF2WJHUUw87lPCu/d7dbID3AtVwdKdAB275rAt6IZEIzXInbw== +"@angular/cli@~10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-10.0.0.tgz#5137aeb89d5d237d09f7c6b37437b0a6e65e224a" + integrity sha512-I+2cltQCmThgrnHwsG5AX0hQ9z6rK/8ysRWWeiJXHtEtqupW9eNzXX1QfXWxWB3o6oIKgijvnLlp04BUlWCyXA== dependencies: - "@angular-devkit/architect" "0.901.9" - "@angular-devkit/core" "9.1.9" - "@angular-devkit/schematics" "9.1.9" - "@schematics/angular" "9.1.9" - "@schematics/update" "0.901.9" + "@angular-devkit/architect" "0.1000.0" + "@angular-devkit/core" "10.0.0" + "@angular-devkit/schematics" "10.0.0" + "@schematics/angular" "10.0.0" + "@schematics/update" "0.1000.0" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.1" debug "4.1.1" ini "1.3.5" inquirer "7.1.0" npm-package-arg "8.0.1" - npm-pick-manifest "6.0.0" - open "7.0.3" + npm-pick-manifest "6.1.0" + open "7.0.4" pacote "9.5.12" read-package-tree "5.3.1" rimraf "3.0.2" - semver "7.1.3" + semver "7.3.2" symbol-observable "1.2.0" universal-analytics "0.4.20" - uuid "7.0.2" + uuid "8.1.0" -"@angular/common@~9.1.11": - version "9.1.11" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-9.1.11.tgz#1323f7b043410791bd2d0d71b0bbb1f862319c04" - integrity sha512-Vh5lF7zWwDK9RedmYXUc8vUXyrecR3j1mAWlTlnmcHYxxFThPzN/dr0slQcPi6nyJn0EmyRKUGvAoZx4rIb7wg== +"@angular/common@~10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-10.0.0.tgz#a819dacbf3b9a3629f7e0d43a504cdd3b5fad58d" + integrity sha512-zaLHMRQqjZyoIc15tLGrwg5ugcVlggqATiMlMVNo9ddqxwpZ4qHK2fdAvqQy9FfWKaPGi6NpIBSR31RGV0ircw== + dependencies: + tslib "^2.0.0" -"@angular/compiler-cli@~9.1.11": - version "9.1.11" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-9.1.11.tgz#39da68ddadb52008fe5231141707bddd3aa790b2" - integrity sha512-9qIxbtpRXOQnRm6inxCa5HuH87MSuMzuceD0YBVzl8v+vLtewon9KXYMmF4kTBhWa/LEa8FrajljLh0azf3VLg== +"@angular/compiler-cli@~10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-10.0.0.tgz#6fe60e239b01fd10d3923a3de88877512e0e2d40" + integrity sha512-KusRkS1NKPrjhj3BXoxRgeejuJVy/ra4dcDV3hpscRmR8FSdim3rs2H+lYK2hZ26ISGsYUvC8cHNaMqP2U3X+g== dependencies: canonical-path "1.0.0" chokidar "^3.0.0" @@ -340,29 +366,45 @@ semver "^6.3.0" source-map "^0.6.1" sourcemap-codec "^1.4.8" + tslib "^2.0.0" yargs "15.3.0" -"@angular/compiler@~9.1.11": - version "9.1.11" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-9.1.11.tgz#4c7100f53c87f47e793e149427b8bdee44302381" - integrity sha512-MbVheCG0U8gt6xtiipau20N26mD2sXjLChVmRKgO6rbDruxboNMZfEd94q9NP9JRaUsVnjXvY7GMDldoymdXig== +"@angular/compiler@~10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-10.0.0.tgz#15f0a0e5760ebc6fcbc06b0b3bb5f110282cf03d" + integrity sha512-meyJKPLLhkgjxF4dvdJq/sw7MI7KvpgYADoFt2K/5dt48ExXRj+kDlyQC6FAwm9mbgSea/A+JpDG8HMPU7AK5Q== + dependencies: + tslib "^2.0.0" -"@angular/core@~9.1.11": - version "9.1.11" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-9.1.11.tgz#7a92d27292212ed381be15f9000d4019867f1c7c" - integrity sha512-KAlEedBo761O1aeoTJVziOSHi8Fttk9ipvbDZXYT/o0W/KdVwubxP34g9t5aD8LCcF8+L0z4VLw++HjdJAUpwg== +"@angular/core@~10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-10.0.0.tgz#b199450576f8acc0549d2836cfa04294fa3a585e" + integrity sha512-N1m6op428ktgcsnXqqspb1xGZ9gp664Jmb4JoVajCD3JXucRfidw+vt3kPOldbWA6M4pIu5ZtZY3IZc2GrK5UQ== + dependencies: + tslib "^2.0.0" -"@angular/forms@~9.1.11": - version "9.1.11" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-9.1.11.tgz#fa246144649236613598a0471aa7f39b60f986b5" - integrity sha512-t4WHrh6ot1r8zdV+3fJz7g9rCok77c9CiIevhH2dR/idxD+HtFR0wqmcBQzsn+rNVB0f0TiSHDrj+TeELIFyWw== +"@angular/forms@~10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-10.0.0.tgz#5c3d88b962552789bae6ad0bd1ffd7914ceeb1bb" + integrity sha512-Jaqs6WmF3fcaL1mKmeZt8pcFHkMuFvgLjbgGFqiOKcdz4UdGTcYkI3mE+UqHpqqXGXYTHLusup8A4TqD7s0rxg== + dependencies: + tslib "^2.0.0" -"@angular/language-service@~9.1.11": - version "9.1.11" - resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-9.1.11.tgz#a2afed4f0167e6f4d3d748214b8e1c27980703ce" - integrity sha512-jfm4etbqldj6MTwECwyoAs7tXEAR8K/8P8dBZnsELhY+V8oFidTJI3NY52PB3Ym7leSPorYdOAeUMMuQfPaVxg== +"@angular/language-service@~10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-10.0.0.tgz#3fead07743f2d958cffc7a755314bfb11181e6cc" + integrity sha512-z0gfvDwNCtWpfQzhGi5BasSiLP9W+J87wlCo+LcyRG359uv3tfVo2gPBwe/gbK3vergru6JWeFbkVHS7KOOG+w== + +"@angular/localize@~10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-10.0.0.tgz#1ca86b40a4e31f18c5e988d9cabdb425a38ec3c8" + integrity sha512-UWuuJYVYDwMGKu8wQuyKH2v0Qbb9HW5n/3tIuw5s0O9yDlhyreueWqCYk42u51p8YDQ7FY7ToZhbMq73G7A8tA== + dependencies: + "@babel/core" "7.8.3" + glob "7.1.2" + yargs "15.3.0" -"@angular/localize@~9.1.0", "@angular/localize@~9.1.11": +"@angular/localize@~9.1.0": version "9.1.11" resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-9.1.11.tgz#25921d794836fb7a07d284c1ac0ed06c10e77d50" integrity sha512-CrR7RniwJIK3+QKH8nHl35KDAHZn1mp1QAd5vujTWKw6YRLfio7SjM9qIfzw5y4WZuUitTsqKlQT/m/NK146Ag== @@ -371,20 +413,26 @@ glob "7.1.2" yargs "15.3.0" -"@angular/platform-browser-dynamic@~9.1.11": - version "9.1.11" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.11.tgz#82af336b05e0d7b7478a2ca7f6282825b211f340" - integrity sha512-Qw3rfVFF0Wtu+UwraqKPCgTA3uoNPGf4vKSfuCuXTrG0p7j+3mCP59aUv5gGH7GV1UQ++jZRx5pbWF43zrC8Hw== +"@angular/platform-browser-dynamic@~10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.0.0.tgz#edf99f3276fa4f13a2a533f742053286fb005354" + integrity sha512-Ol9dMU/UB8PZ1xQkcILmANC+tA1Y/6YeYc8+MYnZUH7uAMXV6kscg9C5fK9JixSldOOS05AQZAdEty9ESjFNNg== + dependencies: + tslib "^2.0.0" -"@angular/platform-browser@~9.1.11": - version "9.1.11" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-9.1.11.tgz#4da8e2a4231d5162304746a39f54cb2d3f241b7c" - integrity sha512-KDxoiFhW4UD+EqchcKpQVSLwg9Rd3JbWytZLchFV6nH8BFnshfJtw2tyPT8bMhFVG9n9zSR4QSGaozWgoDs9mw== +"@angular/platform-browser@~10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-10.0.0.tgz#88cb200f611032c8fd2a54d3d87bda85c09f9dca" + integrity sha512-2gp53WjGUrL1uReewU21IZJa4KFpbigCyDYB0j/KwTkIGrdwYCOjD0/04oHYjkpazPe/VIu3aN7Gb3PgUa3X/Q== + dependencies: + tslib "^2.0.0" -"@angular/router@~9.1.11": - version "9.1.11" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-9.1.11.tgz#b6d28af55fe5631bbc46f306a0e7866253d4f3b1" - integrity sha512-D6CCDeSK/F6dWSB/a1g/zB072xG5LadLSV8afQ57oX1KHePx21LcoRG4tUtFMMHh/jZXRc9pMQIR1/9FrrXF3Q== +"@angular/router@~10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-10.0.0.tgz#c06c873d3b06c4f5cc7c332b1d0887a473495c8b" + integrity sha512-rx9e0eOwXypV/oWLrGsug3wx9lPnD6NUU3i20/VG9O1uMHgXfpnP8RJLcUHqmEMBZEYTLMo59fDE5LEgM1sIFg== + dependencies: + tslib "^2.0.0" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.3", "@babel/code-frame@^7.8.3": version "7.10.3" @@ -393,7 +441,7 @@ dependencies: "@babel/highlight" "^7.10.3" -"@babel/compat-data@^7.10.1", "@babel/compat-data@^7.9.0": +"@babel/compat-data@^7.10.1", "@babel/compat-data@^7.9.6": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.3.tgz#9af3e033f36e8e2d6e47570db91e64a846f5d382" integrity sha512-BDIfJ9uNZuI0LajPfoYV28lX8kyCPMHY6uY4WH1lJdcicmAfxCK5ASzaeV0D/wsUaRH/cLk+amuxtC37sZ8TUg== @@ -423,19 +471,19 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" - integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== +"@babel/core@7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.6.tgz#d9aa1f580abf3b2286ef40b6904d390904c63376" + integrity sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" + "@babel/generator" "^7.9.6" "@babel/helper-module-transforms" "^7.9.0" - "@babel/helpers" "^7.9.0" - "@babel/parser" "^7.9.0" + "@babel/helpers" "^7.9.6" + "@babel/parser" "^7.9.6" "@babel/template" "^7.8.6" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" + "@babel/traverse" "^7.9.6" + "@babel/types" "^7.9.6" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" @@ -467,17 +515,17 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@7.9.3": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.3.tgz#7c8b2956c6f68b3ab732bd16305916fbba521d94" - integrity sha512-RpxM252EYsz9qLUIq6F7YJyK1sv0wWDBFuztfDGWaQKzHjqDHysxSiRUpA/X9jmfqo+WzkAVKFaUily5h+gDCQ== +"@babel/generator@7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.6.tgz#5408c82ac5de98cda0d77d8124e99fa1f2170a43" + integrity sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ== dependencies: - "@babel/types" "^7.9.0" + "@babel/types" "^7.9.6" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" -"@babel/generator@^7.10.3", "@babel/generator@^7.8.3", "@babel/generator@^7.9.0": +"@babel/generator@^7.10.3", "@babel/generator@^7.8.3", "@babel/generator@^7.9.6": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.3.tgz#32b9a0d963a71d7a54f5f6c15659c3dbc2a523a5" integrity sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA== @@ -502,7 +550,7 @@ "@babel/helper-explode-assignable-expression" "^7.10.3" "@babel/types" "^7.10.3" -"@babel/helper-compilation-targets@^7.8.7": +"@babel/helper-compilation-targets@^7.9.6": version "7.10.2" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz#a17d9723b6e2c750299d2a14d4637c76936d8285" integrity sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA== @@ -659,7 +707,7 @@ "@babel/traverse" "^7.10.1" "@babel/types" "^7.10.1" -"@babel/helpers@^7.10.1", "@babel/helpers@^7.8.3", "@babel/helpers@^7.9.0": +"@babel/helpers@^7.10.1", "@babel/helpers@^7.8.3", "@babel/helpers@^7.9.6": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.1.tgz#a6827b7cb975c9d9cef5fd61d919f60d8844a973" integrity sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw== @@ -677,7 +725,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.10.3", "@babel/parser@^7.8.3", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": +"@babel/parser@^7.1.0", "@babel/parser@^7.10.3", "@babel/parser@^7.8.3", "@babel/parser@^7.8.6", "@babel/parser@^7.9.6": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.3.tgz#7e71d892b0d6e7d04a1af4c3c79d72c1f10f5315" integrity sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA== @@ -723,7 +771,7 @@ "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-numeric-separator" "^7.10.1" -"@babel/plugin-proposal-object-rest-spread@^7.9.0": +"@babel/plugin-proposal-object-rest-spread@^7.9.6": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.3.tgz#b8d0d22f70afa34ad84b7a200ff772f9b9fce474" integrity sha512-ZZh5leCIlH9lni5bU/wB/UcjtcVLgR8gc+FAgW2OOY+m9h1II3ItTO1/cewNUcsIDZSYcSaz/rYVls+Fb0ExVQ== @@ -878,7 +926,7 @@ "@babel/helper-plugin-utils" "^7.10.1" lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.9.0": +"@babel/plugin-transform-classes@^7.9.5": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.3.tgz#8d9a656bc3d01f3ff69e1fccb354b0f9d72ac544" integrity sha512-irEX0ChJLaZVC7FvvRoSIxJlmk0IczFLcwaRXUArBKYHCHbOhe57aG8q3uw/fJsoSXvZhjRX960hyeAGlVBXZw== @@ -899,7 +947,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.3" -"@babel/plugin-transform-destructuring@^7.8.3": +"@babel/plugin-transform-destructuring@^7.9.5": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz#abd58e51337815ca3a22a336b85f62b998e71907" integrity sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA== @@ -958,7 +1006,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-modules-amd@^7.9.0": +"@babel/plugin-transform-modules-amd@^7.9.6": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz#65950e8e05797ebd2fe532b96e19fc5482a1d52a" integrity sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw== @@ -967,7 +1015,7 @@ "@babel/helper-plugin-utils" "^7.10.1" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.9.0": +"@babel/plugin-transform-modules-commonjs@^7.9.6": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz#d5ff4b4413ed97ffded99961056e1fb980fb9301" integrity sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg== @@ -977,7 +1025,7 @@ "@babel/helper-simple-access" "^7.10.1" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.9.0": +"@babel/plugin-transform-modules-systemjs@^7.9.6": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.3.tgz#004ae727b122b7b146b150d50cba5ffbff4ac56b" integrity sha512-GWXWQMmE1GH4ALc7YXW56BTh/AlzvDWhUNn9ArFF0+Cz5G8esYlVbXfdyHa1xaD1j+GnBoCeoQNlwtZTVdiG/A== @@ -1017,7 +1065,7 @@ "@babel/helper-plugin-utils" "^7.10.1" "@babel/helper-replace-supers" "^7.10.1" -"@babel/plugin-transform-parameters@^7.10.1", "@babel/plugin-transform-parameters@^7.8.7": +"@babel/plugin-transform-parameters@^7.10.1", "@babel/plugin-transform-parameters@^7.9.5": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz#b25938a3c5fae0354144a720b07b32766f683ddd" integrity sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg== @@ -1046,6 +1094,16 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.1" +"@babel/plugin-transform-runtime@7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.6.tgz#3ba804438ad0d880a17bca5eaa0cdf1edeedb2fd" + integrity sha512-qcmiECD0mYOjOIt8YHNsAP1SxPooC/rDmfmiSK9BNY72EitdSc7l44WTEklaWuFtbOEBjNhWWyph/kOImbNJ4w== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + resolve "^1.8.1" + semver "^5.5.1" + "@babel/plugin-transform-shorthand-properties@^7.8.3": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz#e8b54f238a1ccbae482c4dce946180ae7b3143f3" @@ -1091,13 +1149,13 @@ "@babel/helper-create-regexp-features-plugin" "^7.10.1" "@babel/helper-plugin-utils" "^7.10.1" -"@babel/preset-env@7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" - integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ== +"@babel/preset-env@7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.6.tgz#df063b276c6455ec6fcfc6e53aacc38da9b0aea6" + integrity sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ== dependencies: - "@babel/compat-data" "^7.9.0" - "@babel/helper-compilation-targets" "^7.8.7" + "@babel/compat-data" "^7.9.6" + "@babel/helper-compilation-targets" "^7.9.6" "@babel/helper-module-imports" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-proposal-async-generator-functions" "^7.8.3" @@ -1105,7 +1163,7 @@ "@babel/plugin-proposal-json-strings" "^7.8.3" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" "@babel/plugin-proposal-numeric-separator" "^7.8.3" - "@babel/plugin-proposal-object-rest-spread" "^7.9.0" + "@babel/plugin-proposal-object-rest-spread" "^7.9.6" "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" "@babel/plugin-proposal-optional-chaining" "^7.9.0" "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" @@ -1122,9 +1180,9 @@ "@babel/plugin-transform-async-to-generator" "^7.8.3" "@babel/plugin-transform-block-scoped-functions" "^7.8.3" "@babel/plugin-transform-block-scoping" "^7.8.3" - "@babel/plugin-transform-classes" "^7.9.0" + "@babel/plugin-transform-classes" "^7.9.5" "@babel/plugin-transform-computed-properties" "^7.8.3" - "@babel/plugin-transform-destructuring" "^7.8.3" + "@babel/plugin-transform-destructuring" "^7.9.5" "@babel/plugin-transform-dotall-regex" "^7.8.3" "@babel/plugin-transform-duplicate-keys" "^7.8.3" "@babel/plugin-transform-exponentiation-operator" "^7.8.3" @@ -1132,14 +1190,14 @@ "@babel/plugin-transform-function-name" "^7.8.3" "@babel/plugin-transform-literals" "^7.8.3" "@babel/plugin-transform-member-expression-literals" "^7.8.3" - "@babel/plugin-transform-modules-amd" "^7.9.0" - "@babel/plugin-transform-modules-commonjs" "^7.9.0" - "@babel/plugin-transform-modules-systemjs" "^7.9.0" + "@babel/plugin-transform-modules-amd" "^7.9.6" + "@babel/plugin-transform-modules-commonjs" "^7.9.6" + "@babel/plugin-transform-modules-systemjs" "^7.9.6" "@babel/plugin-transform-modules-umd" "^7.9.0" "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" "@babel/plugin-transform-new-target" "^7.8.3" "@babel/plugin-transform-object-super" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.8.7" + "@babel/plugin-transform-parameters" "^7.9.5" "@babel/plugin-transform-property-literals" "^7.8.3" "@babel/plugin-transform-regenerator" "^7.8.7" "@babel/plugin-transform-reserved-words" "^7.8.3" @@ -1150,8 +1208,8 @@ "@babel/plugin-transform-typeof-symbol" "^7.8.4" "@babel/plugin-transform-unicode-regex" "^7.8.3" "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.9.0" - browserslist "^4.9.1" + "@babel/types" "^7.9.6" + browserslist "^4.11.1" core-js-compat "^3.6.2" invariant "^2.2.2" levenary "^1.1.1" @@ -1168,6 +1226,13 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" +"@babel/runtime@7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.6.tgz#a9102eb5cadedf3f31d08a9ecf294af7827ea29f" + integrity sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.3.tgz#670d002655a7c366540c67f6fd3342cd09500364" @@ -1193,7 +1258,7 @@ "@babel/parser" "^7.10.3" "@babel/types" "^7.10.3" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.1", "@babel/traverse@^7.10.3", "@babel/traverse@^7.8.3", "@babel/traverse@^7.9.0": +"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.1", "@babel/traverse@^7.10.3", "@babel/traverse@^7.8.3", "@babel/traverse@^7.9.6": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.3.tgz#0b01731794aa7b77b214bcd96661f18281155d7e" integrity sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug== @@ -1208,7 +1273,7 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.10.1", "@babel/types@^7.10.3", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0": +"@babel/types@^7.0.0", "@babel/types@^7.10.1", "@babel/types@^7.10.3", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.6": version "7.10.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.3.tgz#6535e3b79fea86a6b09e012ea8528f935099de8e" integrity sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA== @@ -2270,14 +2335,14 @@ jquery "3.5.0" replace-in-file "^4.1.3" -"@ngtools/webpack@9.1.9": - version "9.1.9" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-9.1.9.tgz#2098afd6f1f028238468262df2ad10afa81b82a5" - integrity sha512-7UzRL54JcK1m2PvgpchV26TF9OYipj/8+dygdjaidqOyQujWpHncdtq/ScbUsoJ44nHjIRJPhaGE00NLpWZvnA== +"@ngtools/webpack@10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-10.0.0.tgz#52a86105b04aaeafe7c35461e694b3fa9a838e50" + integrity sha512-2mnuzkCokn84PrBIiSwUqZImd5uKdsdZcpnuvgABmbxe3bAPxbOgzud/bLxG1/ynLvk/vd/FCNeDcY6HylB8OQ== dependencies: - "@angular-devkit/core" "9.1.9" + "@angular-devkit/core" "10.0.0" enhanced-resolve "4.1.1" - rxjs "6.5.4" + rxjs "6.5.5" webpack-sources "1.4.3" "@ngx-validate/core@^0.0.7", "@ngx-validate/core@^0.0.8": @@ -2471,10 +2536,10 @@ dependencies: "@types/node" ">= 8" -"@rollup/plugin-commonjs@^11.0.2": - version "11.1.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-11.1.0.tgz#60636c7a722f54b41e419e1709df05c7234557ef" - integrity sha512-Ycr12N3ZPN96Fw2STurD21jMqzKwL9QuFhms3SD7KKRK7oaXUsBU9Zt0jL/rOPHiPYisI21/rXGO3jr9BnLHUA== +"@rollup/plugin-commonjs@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-13.0.0.tgz#8a1d684ba6848afe8b9e3d85649d4b2f6f7217ec" + integrity sha512-Anxc3qgkAi7peAyesTqGYidG5GRim9jtg8xhmykNaZkImtvjA7Wsqep08D2mYsqw1IF7rA3lYfciLgzUSgRoqw== dependencies: "@rollup/pluginutils" "^3.0.8" commondir "^1.0.1" @@ -2491,14 +2556,16 @@ dependencies: "@rollup/pluginutils" "^3.0.8" -"@rollup/plugin-node-resolve@^7.1.0": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz#80de384edfbd7bfc9101164910f86078151a3eca" - integrity sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q== +"@rollup/plugin-node-resolve@^8.0.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.1.0.tgz#1da5f3d0ccabc8f66f5e3c74462aad76cfd96c47" + integrity sha512-ovq7ZM3JJYUUmEjjO+H8tnUdmQmdQudJB7xruX8LFZ1W2q8jXdPUS6SsIYip8ByOApu4RR7729Am9WhCeCMiHA== dependencies: "@rollup/pluginutils" "^3.0.8" "@types/resolve" "0.0.8" builtin-modules "^3.1.0" + deep-freeze "^0.0.1" + deepmerge "^4.2.2" is-module "^1.0.0" resolve "^1.14.2" @@ -2511,27 +2578,27 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@schematics/angular@9.1.9": - version "9.1.9" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-9.1.9.tgz#df9f30dd7b63856121fbb9ab5dda57b443802a33" - integrity sha512-c8YGZ6pDfr8IDD1qaOjlEBAkEz14KFSxDj0hCWs0xIM0py513tu5sW8+ziYxGG4bgqpsgVR/KAxuY78iBfUVag== +"@schematics/angular@10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-10.0.0.tgz#d74ec2207f1beb52c9e91c300495adb4413ed32a" + integrity sha512-m7Pxz4guAMbe7NASKCPUNxvUX/LeieDjGsXwIt09tVE4dEi9yqJP5zq8kOnZEiLKKflP7GoB65RNex4dTxsydw== dependencies: - "@angular-devkit/core" "9.1.9" - "@angular-devkit/schematics" "9.1.9" + "@angular-devkit/core" "10.0.0" + "@angular-devkit/schematics" "10.0.0" -"@schematics/update@0.901.9": - version "0.901.9" - resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.901.9.tgz#6285611910ebf8bb4078447d2ba32931595efcd4" - integrity sha512-VChX0VO/oyfCF3y+HjMTU2qN3vGgJYxEI1V+Q9aAlwl95t3GAufuaFY1CNW3YV4XkYIjD88e3yWl8d5yO4qf4w== +"@schematics/update@0.1000.0": + version "0.1000.0" + resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.1000.0.tgz#f9f92cd8cb4da3970216782023f35db6672559ff" + integrity sha512-snjz7sQCOn4Xi66XQREXZx9K6R/vAnUfdyO5nXekls8+E+MIowlP+gqHM0whi8qJDwCLd9maYmeVsD6XZaGImQ== dependencies: - "@angular-devkit/core" "9.1.9" - "@angular-devkit/schematics" "9.1.9" + "@angular-devkit/core" "10.0.0" + "@angular-devkit/schematics" "10.0.0" "@yarnpkg/lockfile" "1.1.0" ini "1.3.5" npm-package-arg "^8.0.0" pacote "9.5.12" - rxjs "6.5.4" - semver "7.1.3" + rxjs "6.5.5" + semver "7.3.2" semver-intersect "1.4.0" "@sheerun/mutationobserver-shim@^0.3.2": @@ -2783,150 +2850,149 @@ dependencies: "@types/yargs-parser" "*" -"@webassemblyjs/ast@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" - integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== - dependencies: - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" - -"@webassemblyjs/floating-point-hex-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" - integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== - -"@webassemblyjs/helper-api-error@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" - integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== - -"@webassemblyjs/helper-buffer@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" - integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== - -"@webassemblyjs/helper-code-frame@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" - integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== - dependencies: - "@webassemblyjs/wast-printer" "1.8.5" - -"@webassemblyjs/helper-fsm@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" - integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== - -"@webassemblyjs/helper-module-context@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" - integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== - dependencies: - "@webassemblyjs/ast" "1.8.5" - mamacro "^0.0.3" - -"@webassemblyjs/helper-wasm-bytecode@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" - integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== - -"@webassemblyjs/helper-wasm-section@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" - integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - -"@webassemblyjs/ieee754@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" - integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" - integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" - integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== - -"@webassemblyjs/wasm-edit@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" - integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/helper-wasm-section" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-opt" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - "@webassemblyjs/wast-printer" "1.8.5" - -"@webassemblyjs/wasm-gen@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" - integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" - -"@webassemblyjs/wasm-opt@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" - integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - -"@webassemblyjs/wasm-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" - integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" - -"@webassemblyjs/wast-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" - integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/floating-point-hex-parser" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-code-frame" "1.8.5" - "@webassemblyjs/helper-fsm" "1.8.5" +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" "@xtuc/long" "4.2.2" -"@webassemblyjs/wast-printer@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" - integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" "@xtuc/long" "4.2.2" "@xtuc/ieee754@^1.2.0": @@ -2961,7 +3027,7 @@ JSONStream@^1.0.4, JSONStream@^1.3.4: jsonparse "^1.2.0" through ">=2.2.7 <3" -abab@^2.0.0: +abab@^2.0.0, abab@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== @@ -2992,7 +3058,7 @@ acorn-walk@^6.0.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== -acorn@^6.0.1, acorn@^6.2.1: +acorn@^6.0.1, acorn@^6.4.1: version "6.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== @@ -3007,6 +3073,17 @@ add-stream@^1.0.0: resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" integrity sha1-anmQQ3ynNtXhKI25K9MmbV9csqo= +adjust-sourcemap-loader@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz#6471143af75ec02334b219f54bc7970c52fb29a4" + integrity sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA== + dependencies: + assert "1.4.1" + camelcase "5.0.0" + loader-utils "1.2.3" + object-path "0.11.4" + regex-parser "2.2.10" + adm-zip@^0.4.9: version "0.4.16" resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" @@ -3071,7 +3148,7 @@ ajv@6.12.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.5.5: +ajv@6.12.2, ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.5.5: version "6.12.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== @@ -3239,6 +3316,11 @@ aria-query@3.0.0, aria-query@^3.0.0: ast-types-flow "0.0.7" commander "^2.11.0" +arity-n@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" + integrity sha1-2edrEXM+CFacCEeuezmyhgswt0U= + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -3342,6 +3424,13 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= +assert@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= + dependencies: + util "0.10.3" + assert@^1.1.1: version "1.5.0" resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" @@ -3375,7 +3464,7 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async@^2.5.0, async@^2.6.2: +async@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== @@ -3402,20 +3491,20 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@9.7.4: - version "9.7.4" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.4.tgz#f8bf3e06707d047f0641d87aee8cfb174b2a5378" - integrity sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g== +autoprefixer@9.8.0: + version "9.8.0" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.0.tgz#68e2d2bef7ba4c3a65436f662d0a56a741e56511" + integrity sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A== dependencies: - browserslist "^4.8.3" - caniuse-lite "^1.0.30001020" + browserslist "^4.12.0" + caniuse-lite "^1.0.30001061" chalk "^2.4.2" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.26" - postcss-value-parser "^4.0.2" + postcss "^7.0.30" + postcss-value-parser "^4.1.0" -autoprefixer@^9.7.6: +autoprefixer@^9.6.5: version "9.8.4" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.4.tgz#736f1012673a70fa3464671d78d41abd54512863" integrity sha512-84aYfXlpUe45lvmS+HoAWKCkirI/sw4JK0/bTeeqgHYco3dcsOn0NqdejISjptsYwNji/21dnkDri9PsYKk89A== @@ -3459,15 +3548,16 @@ babel-jest@^25.5.1: graceful-fs "^4.2.4" slash "^3.0.0" -babel-loader@8.0.6: - version "8.0.6" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" - integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw== +babel-loader@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== dependencies: - find-cache-dir "^2.0.0" - loader-utils "^1.0.2" - mkdirp "^0.5.1" + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + mkdirp "^0.5.3" pify "^4.0.1" + schema-utils "^2.6.5" babel-plugin-dynamic-import-node@^2.3.3: version "2.3.3" @@ -3766,7 +3856,7 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.8.3, browserslist@^4.8.5, browserslist@^4.9.1: +browserslist@^4.0.0, browserslist@^4.11.1, browserslist@^4.12.0, browserslist@^4.7.0, browserslist@^4.8.5, browserslist@^4.9.1: version "4.12.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.1.tgz#6d08bef149b70d153930780ba762644e0f329122" integrity sha512-WMjXwFtPskSW1pQUDJRxvRKRkeCr7usN0O/Za76N+F4oadaTdQHotSGcX9jT/Hs7mSKPkyMFNvqawB/1HzYDKQ== @@ -3866,12 +3956,12 @@ bytes@3.1.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== -cacache@15.0.0: - version "15.0.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.0.tgz#133b59edbd2a37ea8ef2d54964c6f247e47e5059" - integrity sha512-L0JpXHhplbJSiDGzyJJnJCTL7er7NzbBgxzVqLswEb4bO91Zbv17OUMuUeu/q0ZwKn3V+1HM4wb9tO4eVE/K8g== +cacache@15.0.3: + version "15.0.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.3.tgz#2225c2d1dd8e872339950d6a39c051e0e9334392" + integrity sha512-bc3jKYjqv7k4pWh7I/ixIjfcjPul4V4jme/WbjvwGS5LzoPL/GzXr4C5EgPNLO/QEZl9Oi61iGitYEdwcrwLCQ== dependencies: - chownr "^1.1.2" + chownr "^2.0.0" fs-minipass "^2.0.0" glob "^7.1.4" infer-owner "^1.0.4" @@ -3881,12 +3971,12 @@ cacache@15.0.0: minipass-flush "^1.0.5" minipass-pipeline "^1.2.2" mkdirp "^1.0.3" - move-concurrently "^1.0.1" - p-map "^3.0.0" + move-file "^2.0.0" + p-map "^4.0.0" promise-inflight "^1.0.1" - rimraf "^2.7.1" + rimraf "^3.0.2" ssri "^8.0.0" - tar "^6.0.1" + tar "^6.0.2" unique-filename "^1.1.1" cacache@^12.0.0, cacache@^12.0.2, cacache@^12.0.3: @@ -3910,7 +4000,7 @@ cacache@^12.0.0, cacache@^12.0.2, cacache@^12.0.3: unique-filename "^1.1.1" y18n "^4.0.0" -cacache@^15.0.4: +cacache@^15.0.3, cacache@^15.0.4: version "15.0.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.4.tgz#b2c23cf4ac4f5ead004fb15a0efb0a20340741f1" integrity sha512-YlnKQqTbD/6iyoJvEY3KJftjrdBYroCbxxYXzhOzsFLWlp6KX4BOlEf4mTx0cMUfVaTS3ENL2QtDWeRYoGLkkw== @@ -4021,6 +4111,16 @@ camelcase-keys@^6.2.2: map-obj "^4.0.0" quick-lru "^4.0.1" +camelcase@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" + integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== + +camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" @@ -4031,11 +4131,6 @@ camelcase@^4.1.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - camelcase@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" @@ -4051,7 +4146,7 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001032, caniuse-lite@^1.0.30001087, caniuse-lite@^1.0.30001088: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001032, caniuse-lite@^1.0.30001061, caniuse-lite@^1.0.30001087, caniuse-lite@^1.0.30001088: version "1.0.30001088" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001088.tgz#23a6b9e192106107458528858f2c0e0dba0d9073" integrity sha512-6eYUrlShRYveyqKG58HcyOfPgh3zb2xqs7NvT2VVtP3hEUeeWvc3lqhpeMTxYWBBeeaT9A4bKsrtjATm66BTHg== @@ -4216,13 +4311,6 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -clean-css@^4.1.11: - version "4.2.3" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" - integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== - dependencies: - source-map "~0.6.0" - clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -4257,15 +4345,6 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -4305,7 +4384,7 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= -clone@^2.1.1, clone@^2.1.2: +clone@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= @@ -4432,10 +4511,10 @@ commander@^2.11.0, commander@^2.12.1, commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== commitizen@^4.0.3: version "4.1.2" @@ -4475,6 +4554,13 @@ component-emitter@^1.2.1: resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== +compose-function@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" + integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8= + dependencies: + arity-n "^1.0.4" + compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -4773,13 +4859,18 @@ conventional-recommended-bump@^5.0.0: meow "^4.0.0" q "^1.5.1" -convert-source-map@^1.4.0, convert-source-map@^1.5.1, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@1.7.0, convert-source-map@^1.4.0, convert-source-map@^1.5.1, convert-source-map@^1.6.0, 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== dependencies: safe-buffer "~5.1.1" +convert-source-map@^0.3.3: + version "0.3.5" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" + integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -4949,10 +5040,10 @@ css-declaration-sorter@^4.0.1: postcss "^7.0.1" timsort "^0.3.0" -css-loader@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.5.1.tgz#db2b2336f4169edb68e6a829ad4fd36552647b77" - integrity sha512-0G4CbcZzQ9D1Q6ndOfjFuMDo8uLYMu5vc9Abs5ztyHcKvmil6GJrMiNjzzi3tQvUF+mVRuDg7bE6Oc0Prolgig== +css-loader@3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.5.3.tgz#95ac16468e1adcd95c844729e0bb167639eb0bcf" + integrity sha512-UEr9NH5Lmi7+dguAm+/JSPovNjYbm2k3TK58EiwQHzOHH5Jfq1Y+XoP2bQO6TMn7PptMd0opxxedAWcaSTRKHw== dependencies: camelcase "^5.3.1" cssesc "^3.0.0" @@ -4965,7 +5056,7 @@ css-loader@3.5.1: postcss-modules-scope "^2.2.0" postcss-modules-values "^3.0.0" postcss-value-parser "^4.0.3" - schema-utils "^2.6.5" + schema-utils "^2.6.6" semver "^6.3.0" css-parse@~2.0.0: @@ -5185,6 +5276,14 @@ cz-conventional-changelog@3.2.0: optionalDependencies: "@commitlint/load" ">6.1.1" +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + damerau-levenshtein@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" @@ -5213,6 +5312,15 @@ data-urls@^1.1.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + dateformat@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" @@ -5298,6 +5406,11 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +deep-freeze@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/deep-freeze/-/deep-freeze-0.0.1.tgz#3a0b0005de18672819dfd38cd31f91179c893e84" + integrity sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ= + deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -5637,6 +5750,11 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + emojis-list@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" @@ -5739,6 +5857,24 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es5-ext@^0.10.35, es5-ext@^0.10.50: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + +es6-iterator@2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + es6-promise@^4.0.3: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" @@ -5751,6 +5887,14 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + escalade@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.1.tgz#52568a77443f6927cd0ab9c73129137533c965ed" @@ -5980,6 +6124,13 @@ express@^4.17.1: utils-merge "1.0.1" vary "~1.1.2" +ext@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + dependencies: + type "^2.0.0" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -6191,7 +6342,7 @@ find-cache-dir@3.3.1, find-cache-dir@^3.3.1: make-dir "^3.0.2" pkg-dir "^4.1.0" -find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: +find-cache-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== @@ -6419,11 +6570,6 @@ gensync@^1.0.0-beta.1: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - get-caller-file@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -7026,6 +7172,13 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.5.2.tgz#af6d628dccfb463b7364d97f715e4b74b8c8c2b8" + integrity sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag== + dependencies: + safer-buffer ">= 2.1.2 < 3" + icss-utils@^4.0.0, icss-utils@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" @@ -7289,11 +7442,6 @@ invariant@^2.2.2, invariant@^2.2.4: dependencies: loose-envify "^1.0.0" -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - ip-regex@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" @@ -8160,10 +8308,10 @@ jest-watcher@^25.5.0: jest-util "^25.5.0" string-length "^3.1.0" -jest-worker@25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.1.0.tgz#75d038bad6fdf58eba0d2ec1835856c497e3907a" - integrity sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg== +jest-worker@26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.0.0.tgz#4920c7714f0a96c6412464718d0c58a3df3fb066" + integrity sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw== dependencies: merge-stream "^2.0.0" supports-color "^7.0.0" @@ -8418,13 +8566,6 @@ latest-version@^5.0.0: dependencies: package-json "^6.3.0" -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - lerna@^3.19.0: version "3.22.1" resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.22.1.tgz#82027ac3da9c627fd8bf02ccfeff806a98e65b62" @@ -8449,16 +8590,17 @@ lerna@^3.19.0: import-local "^2.0.0" npmlog "^4.1.2" -less-loader@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-5.0.0.tgz#498dde3a6c6c4f887458ee9ed3f086a12ad1b466" - integrity sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg== +less-loader@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-6.1.0.tgz#59fd591df408ced89a40fce11a2aea449b005631" + integrity sha512-/jLzOwLyqJ7Kt3xg5sHHkXtOyShWwFj410K9Si9WO+/h8rmYxxkSR0A3/hFEntWudE20zZnWMtpMYnLzqTVdUA== dependencies: - clone "^2.1.1" - loader-utils "^1.1.0" - pify "^4.0.1" + clone "^2.1.2" + less "^3.11.1" + loader-utils "^2.0.0" + schema-utils "^2.6.6" -less@3.11.3, less@^3.10.3: +less@^3.10.3, less@^3.11.1: version "3.11.3" resolved "https://registry.yarnpkg.com/less/-/less-3.11.3.tgz#2d853954fcfe0169a8af869620bcaa16563dcc1c" integrity sha512-VkZiTDdtNEzXA3LgjQiC3D7/ejleBPFVvq+aRI9mIj+Zhmif5TvFPM244bT4rzkvOCvJ9q4zAztok1M7Nygagw== @@ -8495,10 +8637,10 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -license-webpack-plugin@2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.1.4.tgz#c5529a4bb87cc9b4489b486d054ba7cae43a554e" - integrity sha512-1Xq72fmPbTg5KofXs+yI5L4QqPFjQ6mZxoeI6D7gfiEDOtaEIk6PGrdLaej90bpDqKNHNxlQ/MW4tMAL6xMPJQ== +license-webpack-plugin@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.2.0.tgz#5c964380d7d0e0c27c349d86a6f856c82924590e" + integrity sha512-XPsdL/0brSHf+7dXIlRqotnCQ58RX2au6otkOg4U3dm8uH+Ka/fW4iukEs95uXm+qKe/SBs+s1Ll/aQddKG+tg== dependencies: "@types/webpack-sources" "^0.1.5" webpack-sources "^1.2.0" @@ -8552,6 +8694,15 @@ loader-runner@^2.4.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + loader-utils@2.0.0, loader-utils@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" @@ -8791,18 +8942,6 @@ makeerror@1.0.x: dependencies: tmpl "1.0.x" -mamacro@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" - integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== - -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -8854,15 +8993,6 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -9023,7 +9153,7 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -mimic-fn@^2.0.0, mimic-fn@^2.1.0: +mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== @@ -9174,7 +9304,7 @@ mkdirp@*, mkdirp@1.x, mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1, mkdirp@~0.5.x: +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1, mkdirp@~0.5.x: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -9203,6 +9333,13 @@ move-concurrently@^1.0.1: rimraf "^2.5.4" run-queue "^1.0.3" +move-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/move-file/-/move-file-2.0.0.tgz#83ffa309b5d7f69d518b28e1333e2ffadf331e3e" + integrity sha512-cdkdhNCgbP5dvS4tlGxZbD+nloio9GIimP57EjqFhwLcMjnU+XJKAZzlmg/TN/AK1LuNAdTSvm3CPPP4Xkv0iQ== + dependencies: + path-exists "^4.0.0" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -9297,31 +9434,36 @@ neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== -ng-packagr@^9.1.5: - version "9.1.5" - resolved "https://registry.yarnpkg.com/ng-packagr/-/ng-packagr-9.1.5.tgz#8f95838b25d5561593cf1766ab893d01b9da8768" - integrity sha512-biuNfM15uLkCW+Vvj8bnuwjX37oX7j5icGm+l71FhM6ydlEl+Cl7PdFXpy9rrIlKFYlYRiPiiiWazGwVGn1icQ== +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +ng-packagr@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/ng-packagr/-/ng-packagr-10.0.0.tgz#e6fd0d2e144cf92de92ba4d7d37b9da0bdb131f1" + integrity sha512-g+xrHgaF1P8URFb2JZZ4TpTD1uSN1JCHyiP3+PVUp/J8q69QRw9A8dl3JiosgbklUcVif2OnoHTpxNtLcVQ7gw== dependencies: - "@rollup/plugin-commonjs" "^11.0.2" + "@rollup/plugin-commonjs" "^13.0.0" "@rollup/plugin-json" "^4.0.0" - "@rollup/plugin-node-resolve" "^7.1.0" + "@rollup/plugin-node-resolve" "^8.0.0" ajv "^6.10.2" - autoprefixer "^9.7.6" - browserslist "^4.12.0" + autoprefixer "^9.6.5" + browserslist "^4.7.0" chalk "^4.0.0" chokidar "^3.2.1" - clean-css "^4.1.11" - commander "^4.0.0" + commander "^5.0.0" + cssnano-preset-default "^4.0.7" fs-extra "^9.0.0" glob "^7.1.2" injection-js "^2.2.1" less "^3.10.3" node-sass-tilde-importer "^1.0.0" - postcss "^7.0.18" + postcss "^7.0.29" postcss-url "^8.0.0" read-pkg-up "^5.0.0" rimraf "^3.0.0" - rollup "2.7.5" + rollup "^2.8.0" rollup-plugin-sourcemaps "^0.6.0" rxjs "^6.5.0" sass "^1.23.0" @@ -9567,10 +9709,10 @@ npm-packlist@^1.1.12, npm-packlist@^1.4.4: npm-bundled "^1.0.1" npm-normalize-package-bin "^1.0.1" -npm-pick-manifest@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-6.0.0.tgz#bfde7abe95f2670aed1629a3c18245ccb3cc2eb8" - integrity sha512-PdJpXMvjqt4nftNEDpCgjBUF8yI3Q3MyuAmVB9nemnnCg32F4BPL/JFBfdj8DubgHCYUFQhtLWmBPvdsFtjWMg== +npm-pick-manifest@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz#2befed87b0fce956790f62d32afb56d7539c022a" + integrity sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw== dependencies: npm-install-checks "^4.0.0" npm-package-arg "^8.0.0" @@ -9681,6 +9823,11 @@ object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +object-path@0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949" + integrity sha1-NwrnUvvzfePqcKhhwju6iRVpGUk= + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -9766,10 +9913,10 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" -open@7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/open/-/open-7.0.3.tgz#db551a1af9c7ab4c7af664139930826138531c48" - integrity sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA== +open@7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/open/-/open-7.0.4.tgz#c28a9d315e5c98340bf979fdcb2e58664aa10d83" + integrity sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ== dependencies: is-docker "^2.0.0" is-wsl "^2.1.1" @@ -9793,10 +9940,10 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" -ora@4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.3.tgz#752a1b7b4be4825546a7a3d59256fa523b6b6d05" - integrity sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg== +ora@4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.4.tgz#e8da697cc5b6a47266655bf68e0fb588d29a545d" + integrity sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww== dependencies: chalk "^3.0.0" cli-cursor "^3.1.0" @@ -9836,15 +9983,6 @@ os-homedir@^1.0.0: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -os-locale@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - os-name@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" @@ -9871,11 +10009,6 @@ p-cancelable@^1.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= - p-each-series@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.1.0.tgz#961c8dd3f195ea96c747e636b262b800a6b1af48" @@ -9891,11 +10024,6 @@ p-finally@^2.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -9943,13 +10071,6 @@ p-map@^2.0.0, p-map@^2.1.0: resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -10309,6 +10430,13 @@ pn@^1.1.0: resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== +pnp-webpack-plugin@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + dependencies: + ts-pnp "^1.1.6" + portfinder@^1.0.26: version "1.0.26" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.26.tgz#475658d56ca30bed72ac7f1378ed350bd1b64e70" @@ -10670,16 +10798,25 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== -postcss@7.0.27: - version "7.0.27" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" - integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== +postcss@7.0.21: + version "7.0.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" + integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@7.0.31: + version "7.0.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.31.tgz#332af45cb73e26c0ee2614d7c7fb02dfcc2bd6dd" + integrity sha512-a937VDHE1ftkjk+8/7nj/mrjtmkn69xxzJgRETXdAUU+IgOYPQNJF17haGWbeDxSyk++HA14UA98FurvPyBJOA== dependencies: chalk "^2.4.2" source-map "^0.6.1" supports-color "^6.1.0" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.18, postcss@^7.0.2, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.2, postcss@^7.0.27, postcss@^7.0.29, postcss@^7.0.30, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: version "7.0.32" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== @@ -10805,10 +10942,10 @@ protoduck@^5.0.1: dependencies: genfun "^5.0.0" -protractor@~5.4.0: - version "5.4.4" - resolved "https://registry.yarnpkg.com/protractor/-/protractor-5.4.4.tgz#b241466aaf83b76bc2c58df67deb9a5cdfc61529" - integrity sha512-BaL4vePgu3Vfa/whvTUAlgaCAId4uNSGxIFSCXMgj7LMYENPWLp85h5RBi9pdpX/bWQ8SF6flP7afmi2TC4eHw== +protractor@~7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/protractor/-/protractor-7.0.0.tgz#c3e263608bd72e2c2dc802b11a772711a4792d03" + integrity sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw== dependencies: "@types/q" "^0.0.32" "@types/selenium-webdriver" "^3.0.0" @@ -10823,8 +10960,8 @@ protractor@~5.4.0: selenium-webdriver "3.6.0" source-map-support "~0.4.0" webdriver-js-extender "2.1.0" - webdriver-manager "^12.0.6" - yargs "^12.0.5" + webdriver-manager "^12.1.7" + yargs "^15.3.1" proxy-addr@~2.0.5: version "2.0.6" @@ -10986,13 +11123,13 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -raw-loader@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.0.tgz#d639c40fb9d72b5c7f8abc1fb2ddb25b29d3d540" - integrity sha512-iINUOYvl1cGEmfoaLjnZXt4bKfT2LJnZZib5N/LLyAphC+Dd11vNP9CNVb38j+SAJpFI1uo8j9frmih53ASy7Q== +raw-loader@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.1.tgz#14e1f726a359b68437e183d5a5b7d33a3eba6933" + integrity sha512-baolhQBSi3iNh1cglJjA0mYzga+wePk7vdEX//1dTFd+v4TsQlQE0jitJSNF1OIP82rdYulH7otaVmdlDaJ64A== dependencies: - loader-utils "^1.2.3" - schema-utils "^2.5.0" + loader-utils "^2.0.0" + schema-utils "^2.6.5" rc@^1.2.8: version "1.2.8" @@ -11234,6 +11371,11 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regex-parser@2.2.10: + version "2.2.10" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.10.tgz#9e66a8f73d89a107616e63b39d4deddfee912b37" + integrity sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA== + regexp.prototype.flags@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" @@ -11358,11 +11500,6 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= - require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" @@ -11417,6 +11554,22 @@ resolve-global@^1.0.0: dependencies: global-dirs "^0.1.1" +resolve-url-loader@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz#28931895fa1eab9be0647d3b2958c100ae3c0bf0" + integrity sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ== + dependencies: + adjust-sourcemap-loader "2.0.0" + camelcase "5.3.1" + compose-function "3.0.3" + convert-source-map "1.7.0" + es6-iterator "2.0.3" + loader-utils "1.2.3" + postcss "7.0.21" + rework "1.0.1" + rework-visit "1.0.0" + source-map "0.6.1" + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -11427,7 +11580,7 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.3.2: +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.8.1: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== @@ -11477,6 +11630,19 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rework-visit@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" + integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo= + +rework@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" + integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc= + dependencies: + convert-source-map "^0.3.3" + css "^2.0.0" + rgb-regex@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" @@ -11499,7 +11665,7 @@ rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" -rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1: +rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -11522,17 +11688,17 @@ rollup-plugin-sourcemaps@^0.6.0: "@rollup/pluginutils" "^3.0.9" source-map-resolve "^0.6.0" -rollup@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.1.0.tgz#552e248e397a06b9c6db878c0564ca4ee06729c9" - integrity sha512-gfE1455AEazVVTJoeQtcOq/U6GSxwoj4XPSWVsuWmgIxj7sBQNLDOSA82PbdMe+cP8ql8fR1jogPFe8Wg8g4SQ== +rollup@2.10.9: + version "2.10.9" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.10.9.tgz#17dcc6753c619efcc1be2cf61d73a87827eebdf9" + integrity sha512-dY/EbjiWC17ZCUSyk14hkxATAMAShkMsD43XmZGWjLrgFj15M3Dw2kEkA9ns64BiLFm9PKN6vTQw8neHwK74eg== optionalDependencies: fsevents "~2.1.2" -rollup@2.7.5: - version "2.7.5" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.7.5.tgz#dd4e4518b58348a841aefa47bea544f3be27a76f" - integrity sha512-xQSM8uzhgtF6tTnTVEvOQThrcG3LPUP3T/4l4EukzDp0kbTY1QRDuXjiwtYzs9odKj9Bj/PccRG6viFfS7DmCQ== +rollup@^2.8.0: + version "2.18.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.18.0.tgz#f03801e5dd01415e5675dcf61c824ea493ca0392" + integrity sha512-LhuQQp3WpnHo3HlKCRrdMXpB6jdLsGOoXXSfMjbv74s5VdV3WZhkYJT0Z6w/EH3UgPH+g/S9T4GJrKW/5iD8TA== optionalDependencies: fsevents "~2.1.2" @@ -11572,7 +11738,7 @@ rxjs@6.5.4: dependencies: tslib "^1.9.0" -rxjs@^6.4.0, rxjs@^6.5.0, rxjs@^6.5.2, rxjs@^6.5.3, rxjs@~6.5.4: +rxjs@6.5.5, rxjs@^6.4.0, rxjs@^6.5.0, rxjs@^6.5.2, rxjs@^6.5.3, rxjs@~6.5.4: version "6.5.5" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== @@ -11627,10 +11793,10 @@ sass-loader@8.0.2: schema-utils "^2.6.1" semver "^6.3.0" -sass@1.26.3: - version "1.26.3" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.26.3.tgz#412df54486143b76b5a65cdf7569e86f44659f46" - integrity sha512-5NMHI1+YFYw4sN3yfKjpLuV9B5l7MqQ6FlkTcC4FT+oHbBRUZoSjHrrt/mE0nFXJyY2kQtU9ou9HxvFVjLFuuw== +sass@1.26.5: + version "1.26.5" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.26.5.tgz#2d7aecfbbabfa298567c8f06615b6e24d2d68099" + integrity sha512-FG2swzaZUiX53YzZSjSakzvGtlds0lcbF+URuU9mxOv7WBh7NhXEVDa4kPKN4hN6fC2TkOTOKqiqp6d53N9X5Q== dependencies: chokidar ">=2.0.0 <4.0.0" @@ -11669,7 +11835,7 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.5.0, schema-utils@^2.6.1, schema-utils@^2.6.4, schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0: +schema-utils@^2.6.1, schema-utils@^2.6.4, schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== @@ -11731,12 +11897,7 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.3.tgz#e4345ce73071c53f336445cfc19efb1c311df2a6" - integrity sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA== - -semver@7.x, semver@^7.0.0, semver@^7.1.1: +semver@7.3.2, semver@7.x, semver@^7.0.0, semver@^7.1.1: version "7.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== @@ -11765,7 +11926,7 @@ send@0.17.1: range-parser "~1.2.1" statuses "~1.5.0" -serialize-javascript@^3.1.0: +serialize-javascript@^3.0.0, serialize-javascript@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea" integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg== @@ -12011,13 +12172,16 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -source-map-loader@0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-0.2.4.tgz#c18b0dc6e23bf66f6792437557c569a11e072271" - integrity sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ== +source-map-loader@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-1.0.0.tgz#240b88575a9b0d27214aeecbd4e7686af95cfa56" + integrity sha512-ZayyQCSCrQazN50aCvuS84lJT4xc1ZAcykH5blHaBdVveSwjiFK8UGMPvao0ho54DTb0Jf7m57uRRG/YYUZ2Fg== dependencies: - async "^2.5.0" - loader-utils "^1.1.0" + data-urls "^2.0.0" + iconv-lite "^0.5.1" + loader-utils "^2.0.0" + schema-utils "^2.6.6" + source-map "^0.6.0" source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: version "0.5.3" @@ -12038,7 +12202,7 @@ source-map-resolve@^0.6.0: atob "^2.1.2" decode-uri-component "^0.2.0" -source-map-support@^0.5.5, source-map-support@^0.5.6, source-map-support@~0.5.12: +source-map-support@0.5.19, source-map-support@^0.5.5, source-map-support@^0.5.6, source-map-support@~0.5.12: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== @@ -12058,6 +12222,11 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + source-map@0.7.3, source-map@^0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" @@ -12068,11 +12237,6 @@ source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8: version "1.4.8" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" @@ -12127,10 +12291,10 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" -speed-measure-webpack-plugin@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.1.tgz#69840a5cdc08b4638697dac7db037f595d7f36a0" - integrity sha512-qVIkJvbtS9j/UeZumbdfz0vg+QfG/zxonAjzefZrqzkr7xOncLVXkeGbTpzd1gjCBM4PmVNkWlkeTVhgskAGSQ== +speed-measure-webpack-plugin@1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.3.tgz#6ff894fc83e8a6310dde3af863a0329cd79da4f5" + integrity sha512-2ljD4Ch/rz2zG3HsLsnPfp23osuPBS0qPuz9sGpkNXTN1Ic4M+W9xB8l8rS8ob2cO4b1L+WTJw/0AJwWYVgcxQ== dependencies: chalk "^2.0.1" @@ -12276,7 +12440,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -12425,13 +12589,13 @@ strong-log-transformer@^2.0.0: minimist "^1.2.0" through "^2.3.4" -style-loader@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.1.3.tgz#9e826e69c683c4d9bf9db924f85e9abb30d5e200" - integrity sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw== +style-loader@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.2.1.tgz#c5cbbfbf1170d076cfdd86e0109c5bba114baa1a" + integrity sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg== dependencies: - loader-utils "^1.2.3" - schema-utils "^2.6.4" + loader-utils "^2.0.0" + schema-utils "^2.6.6" stylehacks@^4.0.0: version "4.0.3" @@ -12565,7 +12729,7 @@ tar@^4.4.10, tar@^4.4.12, tar@^4.4.8: safe-buffer "^5.1.2" yallist "^3.0.3" -tar@^6.0.1, tar@^6.0.2: +tar@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.2.tgz#5df17813468a6264ff14f766886c622b84ae2f39" integrity sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg== @@ -12620,17 +12784,17 @@ terminal-link@^2.0.0: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" -terser-webpack-plugin@3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-3.0.3.tgz#23bda2687b197f878a743373b9411d917adc2e45" - integrity sha512-bZFnotuIKq5Rqzrs+qIwFzGdKdffV9epG5vDSEbYzvKAhPeR5RbbrQysfPgbIIMhNAQtZD2hGwBfSKUXjXZZZw== +terser-webpack-plugin@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-3.0.1.tgz#31928c9330a582fb5ec6f90805337289b85cb8fe" + integrity sha512-eFDtq8qPUEa9hXcUzTwKXTnugIVtlqc1Z/ZVhG8LmRT3lgRY13+pQTnFLY2N7ATB6TKCHuW/IGjoAnZz9wOIqw== dependencies: - cacache "^15.0.4" + cacache "^15.0.3" find-cache-dir "^3.3.1" jest-worker "^26.0.0" p-limit "^2.3.0" schema-utils "^2.6.6" - serialize-javascript "^3.1.0" + serialize-javascript "^3.0.0" source-map "^0.6.1" terser "^4.6.13" webpack-sources "^1.4.3" @@ -12650,10 +12814,10 @@ terser-webpack-plugin@^1.4.3: webpack-sources "^1.4.0" worker-farm "^1.7.0" -terser@4.6.10: - version "4.6.10" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.10.tgz#90f5bd069ff456ddbc9503b18e52f9c493d3b7c2" - integrity sha512-qbF/3UOo11Hggsbsqm2hPa6+L4w7bkr+09FNseEe8xrcVD3APGLFqE+Oz1ZKAxjYnFsj80rLOfgAtJ0LNJjtTA== +terser@4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.7.0.tgz#15852cf1a08e3256a80428e865a2fa893ffba006" + integrity sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw== dependencies: commander "^2.20.0" source-map "~0.6.1" @@ -12834,6 +12998,13 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +tr46@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" + integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== + dependencies: + punycode "^2.1.1" + tree-kill@1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" @@ -12889,30 +13060,35 @@ ts-node@~7.0.0: source-map-support "^0.5.6" yn "^2.0.0" +ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== + ts-toolbelt@^6.3.6, ts-toolbelt@^6.9.9: version "6.9.9" resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-6.9.9.tgz#e6cfd8ec7d425d2a06bda3b4fe9577ceaf2abda8" integrity sha512-5a8k6qfbrL54N4Dw+i7M6kldrbjgDWb5Vit8DnT+gwThhvqMg8KtxLE5Vmnft+geIgaSOfNJyAcnmmlflS+Vdg== -tsickle@^0.37.0: - version "0.37.1" - resolved "https://registry.yarnpkg.com/tsickle/-/tsickle-0.37.1.tgz#2f8a87c1b15766e866457bd06fb6c0e0d84eed09" - integrity sha512-0GwgOJEnsmRsrONXCvcbAWY0CvdqF3UugPVoupUpA8Ul0qCPTuqqq0ou/hLqtKZOyyulzCP6MYRjb9/J1g9bJg== +tsickle@^0.38.1: + version "0.38.1" + resolved "https://registry.yarnpkg.com/tsickle/-/tsickle-0.38.1.tgz#30762db759d40c435943093b6972c7f2efb384ef" + integrity sha512-4xZfvC6+etRu6ivKCNqMOd1FqcY/m6JY3Y+yr5+Xw+i751ciwrWINi6x/3l1ekcODH9GZhlf0ny2LpzWxnjWYA== -tslib@1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" - integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== +tslib@2.0.0, tslib@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.0.tgz#18d13fc2dce04051e20f074cc8387fd8089ce4f3" + integrity sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g== -tslib@^1.10.0, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: version "1.13.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== -tslint@~5.20.0: - version "5.20.1" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d" - integrity sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg== +tslint@~6.1.0: + version "6.1.2" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.2.tgz#2433c248512cc5a7b2ab88ad44a6b1b34c6911cf" + integrity sha512-UyNrLdK3E0fQG/xWNqAFAC5ugtFyPO4JJR1KyyfQAyzR8W0fTRrC91A8Wej4BntFzcvETdCSDa/4PnNYJQLYiA== dependencies: "@babel/code-frame" "^7.0.0" builtin-modules "^1.1.1" @@ -12922,10 +13098,10 @@ tslint@~5.20.0: glob "^7.1.1" js-yaml "^3.13.1" minimatch "^3.0.4" - mkdirp "^0.5.1" + mkdirp "^0.5.3" resolve "^1.3.2" semver "^5.3.0" - tslib "^1.8.0" + tslib "^1.10.0" tsutils "^2.29.0" tsutils@^2.29.0: @@ -12997,6 +13173,16 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" + integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -13009,21 +13195,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@3.6.5: - version "3.6.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.5.tgz#dae20114a7b4ff4bd642db9c8c699f2953e8bbdb" - integrity sha512-BEjlc0Z06ORZKbtcxGrIvvwYs5hAnuo6TKdNFL55frVDlB+na3z5bsLhFaIxmT+dPWgBIjMo6aNnTOgHHmHgiQ== - -typescript@^3.5.2: +typescript@^3.5.2, typescript@~3.9.5: version "3.9.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36" integrity sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ== -typescript@~3.8.0: - version "3.8.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" - integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w== - uglify-js@^3.1.4: version "3.10.0" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.10.0.tgz#397a7e6e31ce820bfd1cb55b804ee140c587a9e7" @@ -13259,10 +13435,10 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.2.tgz#7ff5c203467e91f5e0d85cfcbaaf7d2ebbca9be6" - integrity sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw== +uuid@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.1.0.tgz#6f1536eb43249f473abc6bd58ff983da1ca30d8d" + integrity sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg== uuid@^3.0.0, uuid@^3.0.1, uuid@^3.3.2, uuid@^3.4.0: version "3.4.0" @@ -13352,7 +13528,7 @@ watchpack-chokidar2@^2.0.0: dependencies: chokidar "^2.1.8" -watchpack@^1.6.0: +watchpack@^1.6.1: version "1.7.2" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.2.tgz#c02e4d4d49913c3e7e122c3325365af9d331e9aa" integrity sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g== @@ -13385,7 +13561,7 @@ webdriver-js-extender@2.1.0: "@types/selenium-webdriver" "^3.0.0" selenium-webdriver "^3.0.1" -webdriver-manager@^12.0.6: +webdriver-manager@^12.1.7: version "12.1.7" resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.1.7.tgz#ed4eaee8f906b33c146e869b55e850553a1b1162" integrity sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA== @@ -13407,6 +13583,11 @@ webidl-conversions@^4.0.2: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + webpack-dev-middleware@3.7.2, webpack-dev-middleware@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" @@ -13480,23 +13661,23 @@ webpack-sources@1.4.3, webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-s source-list-map "^2.0.0" source-map "~0.6.1" -webpack-subresource-integrity@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.4.0.tgz#44963a64c9a214ad729158e7f46d52c2525cc88a" - integrity sha512-GB1kB/LwAWC3CxwcedGhMkxGpNZxSheCe1q+KJP1bakuieAdX/rGHEcf5zsEzhKXpqsGqokgsDoD9dIkr61VDQ== +webpack-subresource-integrity@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.4.1.tgz#e8bf918b444277df46a66cd84542cbcdc5a6272d" + integrity sha512-XMLFInbGbB1HV7K4vHWANzc1CN0t/c4bBvnlvGxGwV45yE/S/feAXIm8dJsCkzqWtSKnmaEgTp/meyeThxG4Iw== dependencies: webpack-sources "^1.3.0" -webpack@4.42.0: - version "4.42.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.0.tgz#b901635dd6179391d90740a63c93f76f39883eb8" - integrity sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w== +webpack@4.43.0: + version "4.43.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.43.0.tgz#c48547b11d563224c561dad1172c8aa0b8a678e6" + integrity sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/wasm-edit" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - acorn "^6.2.1" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" ajv "^6.10.2" ajv-keywords "^3.4.1" chrome-trace-event "^1.0.2" @@ -13507,13 +13688,13 @@ webpack@4.42.0: loader-utils "^1.2.3" memory-fs "^0.4.1" micromatch "^3.1.10" - mkdirp "^0.5.1" + mkdirp "^0.5.3" neo-async "^2.6.1" node-libs-browser "^2.2.1" schema-utils "^1.0.0" tapable "^1.1.3" terser-webpack-plugin "^1.4.3" - watchpack "^1.6.0" + watchpack "^1.6.1" webpack-sources "^1.4.1" websocket-driver@0.6.5: @@ -13558,6 +13739,15 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" +whatwg-url@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.1.0.tgz#c628acdcf45b82274ce7281ee31dd3c839791771" + integrity sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^2.0.2" + webidl-conversions "^5.0.0" + when@~3.6.x: version "3.6.4" resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e" @@ -13627,14 +13817,6 @@ worker-plugin@4.0.3: dependencies: loader-utils "^1.1.0" -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" @@ -13761,7 +13943,7 @@ xxhashjs@^0.2.1: dependencies: cuint "^0.2.2" -"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: +y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== @@ -13789,14 +13971,6 @@ yargs-parser@18.x, yargs-parser@^18.1.0, yargs-parser@^18.1.1, yargs-parser@^18. camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" @@ -13830,24 +14004,6 @@ yargs@15.3.0: y18n "^4.0.0" yargs-parser "^18.1.0" -yargs@^12.0.5: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== - dependencies: - cliui "^4.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" - yargs@^13.3.2: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" From 013782436101d7c5a7feee866e900b9819831256 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 26 Jun 2020 18:03:25 +0800 Subject: [PATCH 089/190] Implement the ICacheSupportsMultipleItems for the AbpRedisCache --- .../Caching/StackExchangeRedis/RedisCache.cs | 496 ++++++++++++++++++ .../StackExchangeRedis/RedisExtensions.cs | 70 +++ .../StackExchangeRedis/AbpRedisCache.cs | 187 ++++++- .../StackExchangeRedis/AbpRedisExtensions.cs | 42 ++ 4 files changed, 772 insertions(+), 23 deletions(-) create mode 100644 framework/src/Volo.Abp.Caching.StackExchangeRedis/Microsoft/Extensions/Caching/StackExchangeRedis/RedisCache.cs create mode 100644 framework/src/Volo.Abp.Caching.StackExchangeRedis/Microsoft/Extensions/Caching/StackExchangeRedis/RedisExtensions.cs create mode 100644 framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisExtensions.cs diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Microsoft/Extensions/Caching/StackExchangeRedis/RedisCache.cs b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Microsoft/Extensions/Caching/StackExchangeRedis/RedisCache.cs new file mode 100644 index 0000000000..32cc85011b --- /dev/null +++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Microsoft/Extensions/Caching/StackExchangeRedis/RedisCache.cs @@ -0,0 +1,496 @@ +// This software is part of the DOTNET extensions +// Copyright (c) .NET Foundation and Contributors +// https://dotnet.microsoft.com/ +// +// All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Caching.Distributed; +using Microsoft.Extensions.Options; +using StackExchange.Redis; + +namespace Microsoft.Extensions.Caching.StackExchangeRedis +{ + public class RedisCache : IDistributedCache, IDisposable + { + // KEYS[1] = = key + // ARGV[1] = absolute-expiration - ticks as long (-1 for none) + // ARGV[2] = sliding-expiration - ticks as long (-1 for none) + // ARGV[3] = relative-expiration (long, in seconds, -1 for none) - Min(absolute-expiration - Now, sliding-expiration) + // ARGV[4] = data - byte[] + // this order should not change LUA script depends on it + protected const string SetScript = (@" + redis.call('HMSET', KEYS[1], 'absexp', ARGV[1], 'sldexp', ARGV[2], 'data', ARGV[4]) + if ARGV[3] ~= '-1' then + redis.call('EXPIRE', KEYS[1], ARGV[3]) + end + return 1"); + + protected const string AbsoluteExpirationKey = "absexp"; + protected const string SlidingExpirationKey = "sldexp"; + protected const string DataKey = "data"; + protected const long NotPresent = -1; + + protected volatile ConnectionMultiplexer Connection; + protected IDatabase Cache; + + protected readonly RedisCacheOptions Options; + protected readonly string Instance; + + protected readonly SemaphoreSlim ConnectionLock = new SemaphoreSlim(initialCount: 1, maxCount: 1); + + public RedisCache(IOptions optionsAccessor) + { + if (optionsAccessor == null) + { + throw new ArgumentNullException(nameof(optionsAccessor)); + } + + Options = optionsAccessor.Value; + + // This allows partitioning a single backend cache for use with multiple apps/services. + Instance = Options.InstanceName ?? string.Empty; + } + + public virtual byte[] Get(string key) + { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + return GetAndRefresh(key, getData: true); + } + + public virtual async Task GetAsync( + string key, + CancellationToken token = default) + { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + token.ThrowIfCancellationRequested(); + + return await GetAndRefreshAsync(key, getData: true, token: token); + } + + public virtual void Set( + string key, + byte[] value, + DistributedCacheEntryOptions options) + { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (options == null) + { + throw new ArgumentNullException(nameof(options)); + } + + Connect(); + + var creationTime = DateTimeOffset.UtcNow; + + var absoluteExpiration = GetAbsoluteExpiration(creationTime, options); + + Cache.ScriptEvaluate(SetScript, new RedisKey[] {Instance + key}, + new RedisValue[] + { + absoluteExpiration?.Ticks ?? NotPresent, + options.SlidingExpiration?.Ticks ?? NotPresent, + GetExpirationInSeconds(creationTime, absoluteExpiration, options) ?? NotPresent, + value + }); + } + + public virtual async Task SetAsync( + string key, + byte[] value, + DistributedCacheEntryOptions options, + CancellationToken token = default) + { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (options == null) + { + throw new ArgumentNullException(nameof(options)); + } + + token.ThrowIfCancellationRequested(); + + await ConnectAsync(token); + + var creationTime = DateTimeOffset.UtcNow; + + var absoluteExpiration = GetAbsoluteExpiration(creationTime, options); + + await Cache.ScriptEvaluateAsync(SetScript, new RedisKey[] {Instance + key}, + new RedisValue[] + { + absoluteExpiration?.Ticks ?? NotPresent, + options.SlidingExpiration?.Ticks ?? NotPresent, + GetExpirationInSeconds(creationTime, absoluteExpiration, options) ?? NotPresent, + value + }); + } + + public virtual void Refresh(string key) + { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + GetAndRefresh(key, getData: false); + } + + public virtual async Task RefreshAsync( + string key, + CancellationToken token = default) + { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + token.ThrowIfCancellationRequested(); + + await GetAndRefreshAsync(key, getData: false, token: token); + } + + protected virtual void Connect() + { + if (Cache != null) + { + return; + } + + ConnectionLock.Wait(); + try + { + if (Cache == null) + { + if (Options.ConfigurationOptions != null) + { + Connection = ConnectionMultiplexer.Connect(Options.ConfigurationOptions); + } + else + { + Connection = ConnectionMultiplexer.Connect(Options.Configuration); + } + + Cache = Connection.GetDatabase(); + } + } + finally + { + ConnectionLock.Release(); + } + } + + protected virtual async Task ConnectAsync(CancellationToken token = default) + { + token.ThrowIfCancellationRequested(); + + if (Cache != null) + { + return; + } + + await ConnectionLock.WaitAsync(token); + try + { + if (Cache == null) + { + if (Options.ConfigurationOptions != null) + { + Connection = await ConnectionMultiplexer.ConnectAsync(Options.ConfigurationOptions); + } + else + { + Connection = await ConnectionMultiplexer.ConnectAsync(Options.Configuration); + } + + Cache = Connection.GetDatabase(); + } + } + finally + { + ConnectionLock.Release(); + } + } + + protected virtual byte[] GetAndRefresh(string key, bool getData) + { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + Connect(); + + // This also resets the LRU status as desired. + // TODO: Can this be done in one operation on the server side? Probably, the trick would just be the DateTimeOffset math. + RedisValue[] results; + if (getData) + { + results = Cache.HashMemberGet(Instance + key, AbsoluteExpirationKey, SlidingExpirationKey, DataKey); + } + else + { + results = Cache.HashMemberGet(Instance + key, AbsoluteExpirationKey, SlidingExpirationKey); + } + + // TODO: Error handling + if (results.Length >= 2) + { + MapMetadata(results, out DateTimeOffset? absExpr, out TimeSpan? sldExpr); + Refresh(key, absExpr, sldExpr); + } + + if (results.Length >= 3 && results[2].HasValue) + { + return results[2]; + } + + return null; + } + + protected virtual async Task GetAndRefreshAsync( + string key, + bool getData, + CancellationToken token = default) + { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + token.ThrowIfCancellationRequested(); + + await ConnectAsync(token); + + // This also resets the LRU status as desired. + // TODO: Can this be done in one operation on the server side? Probably, the trick would just be the DateTimeOffset math. + RedisValue[] results; + if (getData) + { + results = await Cache.HashMemberGetAsync(Instance + key, AbsoluteExpirationKey, SlidingExpirationKey, + DataKey); + } + else + { + results = await Cache.HashMemberGetAsync(Instance + key, AbsoluteExpirationKey, SlidingExpirationKey); + } + + // TODO: Error handling + if (results.Length >= 2) + { + MapMetadata(results, out DateTimeOffset? absExpr, out TimeSpan? sldExpr); + await RefreshAsync(key, absExpr, sldExpr, token); + } + + if (results.Length >= 3 && results[2].HasValue) + { + return results[2]; + } + + return null; + } + + public virtual void Remove(string key) + { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + Connect(); + + Cache.KeyDelete(Instance + key); + // TODO: Error handling + } + + public virtual async Task RemoveAsync( + string key, + CancellationToken token = default) + { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + await ConnectAsync(token); + + await Cache.KeyDeleteAsync(Instance + key); + // TODO: Error handling + } + + protected virtual void MapMetadata( + RedisValue[] results, + out DateTimeOffset? absoluteExpiration, + out TimeSpan? slidingExpiration) + { + absoluteExpiration = null; + slidingExpiration = null; + var absoluteExpirationTicks = (long?) results[0]; + if (absoluteExpirationTicks.HasValue && absoluteExpirationTicks.Value != NotPresent) + { + absoluteExpiration = new DateTimeOffset(absoluteExpirationTicks.Value, TimeSpan.Zero); + } + + var slidingExpirationTicks = (long?) results[1]; + if (slidingExpirationTicks.HasValue && slidingExpirationTicks.Value != NotPresent) + { + slidingExpiration = new TimeSpan(slidingExpirationTicks.Value); + } + } + + protected virtual void Refresh( + string key, + DateTimeOffset? absExpr, + TimeSpan? sldExpr) + { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + // Note Refresh has no effect if there is just an absolute expiration (or neither). + TimeSpan? expr = null; + if (sldExpr.HasValue) + { + if (absExpr.HasValue) + { + var relExpr = absExpr.Value - DateTimeOffset.Now; + expr = relExpr <= sldExpr.Value ? relExpr : sldExpr; + } + else + { + expr = sldExpr; + } + + Cache.KeyExpire(Instance + key, expr); + // TODO: Error handling + } + } + + protected virtual async Task RefreshAsync( + string key, + DateTimeOffset? absExpr, + TimeSpan? sldExpr, + CancellationToken token = default) + { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + token.ThrowIfCancellationRequested(); + + // Note Refresh has no effect if there is just an absolute expiration (or neither). + TimeSpan? expr = null; + if (sldExpr.HasValue) + { + if (absExpr.HasValue) + { + var relExpr = absExpr.Value - DateTimeOffset.Now; + expr = relExpr <= sldExpr.Value ? relExpr : sldExpr; + } + else + { + expr = sldExpr; + } + + await Cache.KeyExpireAsync(Instance + key, expr); + // TODO: Error handling + } + } + + protected static long? GetExpirationInSeconds( + DateTimeOffset creationTime, + DateTimeOffset? absoluteExpiration, + DistributedCacheEntryOptions options) + { + if (absoluteExpiration.HasValue && options.SlidingExpiration.HasValue) + { + return (long) Math.Min( + (absoluteExpiration.Value - creationTime).TotalSeconds, + options.SlidingExpiration.Value.TotalSeconds); + } + else if (absoluteExpiration.HasValue) + { + return (long) (absoluteExpiration.Value - creationTime).TotalSeconds; + } + else if (options.SlidingExpiration.HasValue) + { + return (long) options.SlidingExpiration.Value.TotalSeconds; + } + + return null; + } + + protected static DateTimeOffset? GetAbsoluteExpiration( + DateTimeOffset creationTime, + DistributedCacheEntryOptions options) + { + if (options.AbsoluteExpiration.HasValue && options.AbsoluteExpiration <= creationTime) + { + throw new ArgumentOutOfRangeException( + nameof(DistributedCacheEntryOptions.AbsoluteExpiration), + options.AbsoluteExpiration.Value, + "The absolute expiration value must be in the future."); + } + + var absoluteExpiration = options.AbsoluteExpiration; + if (options.AbsoluteExpirationRelativeToNow.HasValue) + { + absoluteExpiration = creationTime + options.AbsoluteExpirationRelativeToNow; + } + + return absoluteExpiration; + } + + public virtual void Dispose() + { + Connection?.Close(); + } + } +} diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Microsoft/Extensions/Caching/StackExchangeRedis/RedisExtensions.cs b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Microsoft/Extensions/Caching/StackExchangeRedis/RedisExtensions.cs new file mode 100644 index 0000000000..c83c8df7ff --- /dev/null +++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Microsoft/Extensions/Caching/StackExchangeRedis/RedisExtensions.cs @@ -0,0 +1,70 @@ +// This software is part of the DOTNET extensions +// Copyright (c) .NET Foundation and Contributors +// https://dotnet.microsoft.com/ +// +// All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +using System.Threading.Tasks; +using StackExchange.Redis; + +namespace Microsoft.Extensions.Caching.StackExchangeRedis +{ + internal static class RedisExtensions + { + private const string HmGetScript = (@"return redis.call('HMGET', KEYS[1], unpack(ARGV))"); + + internal static RedisValue[] HashMemberGet(this IDatabase cache, string key, params string[] members) + { + var result = cache.ScriptEvaluate( + HmGetScript, + new RedisKey[] { key }, + GetRedisMembers(members)); + + // TODO: Error checking? + return (RedisValue[])result; + } + + internal static async Task HashMemberGetAsync( + this IDatabase cache, + string key, + params string[] members) + { + var result = await cache.ScriptEvaluateAsync( + HmGetScript, + new RedisKey[] { key }, + GetRedisMembers(members)).ConfigureAwait(false); + + // TODO: Error checking? + return (RedisValue[])result; + } + + private static RedisValue[] GetRedisMembers(params string[] members) + { + var redisMembers = new RedisValue[members.Length]; + for (int i = 0; i < members.Length; i++) + { + redisMembers[i] = (RedisValue)members[i]; + } + + return redisMembers; + } + } +} diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs index a5236022f3..e02619bc6e 100644 --- a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs +++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs @@ -1,7 +1,9 @@ using System; -using System.Reflection; +using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks; +using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Caching.StackExchangeRedis; using Microsoft.Extensions.Options; using StackExchange.Redis; @@ -10,40 +12,179 @@ using Volo.Abp.DependencyInjection; namespace Volo.Abp.Caching.StackExchangeRedis { [DisableConventionalRegistration] - public class AbpRedisCache : RedisCache + public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems { - private static readonly FieldInfo RedisDatabaseField; - private static readonly MethodInfo ConnectMethod; - private static readonly MethodInfo ConnectAsyncMethod; + public AbpRedisCache(IOptions optionsAccessor) + : base(optionsAccessor) + { + } - protected IDatabase RedisDatabase => RedisDatabaseField.GetValue(this) as IDatabase; + public byte[][] GetMany( + IEnumerable keys) + { + keys = Check.NotNull(keys, nameof(keys)); - static AbpRedisCache() + return GetAndRefreshMany(keys, true); + } + + public async Task GetManyAsync( + IEnumerable keys, + CancellationToken token = default) { - RedisDatabaseField = typeof(RedisCache) - .GetField("_cache", BindingFlags.Instance | BindingFlags.NonPublic); - - ConnectMethod = typeof(RedisCache) - .GetMethod("Connect", BindingFlags.Instance | BindingFlags.NonPublic); - - ConnectAsyncMethod = typeof(RedisCache) - .GetMethod("ConnectAsync", BindingFlags.Instance | BindingFlags.NonPublic); + keys = Check.NotNull(keys, nameof(keys)); + + return await GetAndRefreshManyAsync(keys, true, token); } - public AbpRedisCache(IOptions optionsAccessor) - : base(optionsAccessor) + public void SetMany( + IEnumerable> items, + DistributedCacheEntryOptions options) + { + Connect(); + + Task.WaitAll(PipelineSetMany(items, options)); + } + + public async Task SetManyAsync( + IEnumerable> items, + DistributedCacheEntryOptions options, + CancellationToken token = default) + { + token.ThrowIfCancellationRequested(); + + await ConnectAsync(token); + + await Task.WhenAll(PipelineSetMany(items, options)); + } + + protected virtual byte[][] GetAndRefreshMany( + IEnumerable keys, + bool getData) + { + Connect(); + + var keyArray = keys.Select(key => Instance + key).ToArray(); + RedisValue[][] results; + + if (getData) + { + results = Cache.HashMemberGetMany(keyArray, AbsoluteExpirationKey, + SlidingExpirationKey, DataKey); + } + else + { + results = Cache.HashMemberGetMany(keyArray, AbsoluteExpirationKey, + SlidingExpirationKey); + } + + Task.WaitAll(GetAndRefreshMany(keyArray, results, out var bytes)); + + return bytes; + } + + protected virtual async Task GetAndRefreshManyAsync( + IEnumerable keys, + bool getData, + CancellationToken token = default) { - + token.ThrowIfCancellationRequested(); + + await ConnectAsync(token); + + var keyArray = keys.Select(key => Instance + key).ToArray(); + RedisValue[][] results; + + if (getData) + { + results = await Cache.HashMemberGetManyAsync(keyArray, AbsoluteExpirationKey, + SlidingExpirationKey, DataKey); + } + else + { + results = await Cache.HashMemberGetManyAsync(keyArray, AbsoluteExpirationKey, + SlidingExpirationKey); + } + + await Task.WhenAll(GetAndRefreshMany(keyArray, results, out var bytes)); + + return bytes; } - protected virtual void Connect() + private Task[] GetAndRefreshMany(string[] keys, RedisValue[][] results, out byte[][] bytes) { - ConnectMethod.Invoke(this, Array.Empty()); + bytes = new byte[keys.Length][]; + var tasks = new Task[keys.Length]; + for (var i = 0; i < keys.Length; i++) + { + if (results[i].Length >= 2) + { + MapMetadata(results[i], out DateTimeOffset? absExpr, out TimeSpan? sldExpr); + tasks[i] = PipelineRefresh(keys[i], absExpr, sldExpr); + } + + if (results[i].Length >= 3 && results[i][2].HasValue) + { + bytes[i] = results[i][2]; + } + else + { + bytes[i] = null; + } + } + + return tasks; + } + + private Task PipelineRefresh( + string key, + DateTimeOffset? absExpr, + TimeSpan? sldExpr) + { + if (sldExpr.HasValue) + { + TimeSpan? expr; + + if (absExpr.HasValue) + { + var relExpr = absExpr.Value - DateTimeOffset.Now; + expr = relExpr <= sldExpr.Value ? relExpr : sldExpr; + } + else + { + expr = sldExpr; + } + + return Cache.KeyExpireAsync(key, expr); + } + + return Task.CompletedTask; } - protected virtual Task ConnectAsync(CancellationToken token = default) + private Task[] PipelineSetMany( + IEnumerable> items, + DistributedCacheEntryOptions options) { - return (Task) ConnectAsyncMethod.Invoke(this, new object[] {token}); + items = Check.NotNull(items, nameof(items)); + options = Check.NotNull(options, nameof(options)); + + var itemArray = items.ToArray(); + var tasks = new Task[itemArray.Length]; + var creationTime = DateTimeOffset.UtcNow; + var absoluteExpiration = GetAbsoluteExpiration(creationTime, options); + + for (var i = 0; i < itemArray.Length; i++) + { + tasks[i] = Cache.ScriptEvaluateAsync(SetScript, new RedisKey[] {Instance + itemArray[i].Key}, + new RedisValue[] + { + absoluteExpiration?.Ticks ?? NotPresent, + options.SlidingExpiration?.Ticks ?? NotPresent, + GetExpirationInSeconds(creationTime, absoluteExpiration, options) ?? NotPresent, + itemArray[i].Value + }); + } + + return tasks; } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisExtensions.cs b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisExtensions.cs new file mode 100644 index 0000000000..d3466d2222 --- /dev/null +++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisExtensions.cs @@ -0,0 +1,42 @@ +using System.Linq; +using System.Threading.Tasks; +using StackExchange.Redis; + +namespace Volo.Abp.Caching.StackExchangeRedis +{ + public static class AbpRedisExtensions + { + private const string HmGetManyScript = (@" + local res = {}; + for i , key in ipairs(KEYS) do + res[#res+1] = redis.call('HMGET', key,unpack(ARGV)) + end + return res"); + + public static RedisValue[][] HashMemberGetMany( + this IDatabase cache, + string[] keys, + params string[] members) + { + var results = cache.ScriptEvaluate( + HmGetManyScript, + keys.Select(key => (RedisKey) key).ToArray(), + members.Select(member => (RedisValue) member).ToArray()); + + return ((RedisResult[]) results).Select(result => (RedisValue[]) result).ToArray(); + } + + public static async Task HashMemberGetManyAsync( + this IDatabase cache, + string[] keys, + params string[] members) + { + var results = await cache.ScriptEvaluateAsync( + HmGetManyScript, + keys.Select(key => (RedisKey) key).ToArray(), + members.Select(member => (RedisValue) member).ToArray()); + + return ((RedisResult[]) results).Select(result => (RedisValue[]) result).ToArray(); + } + } +} From 2c5e1621cd3c23870cbd4a0c6809826814bd0372 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 26 Jun 2020 14:18:16 +0300 Subject: [PATCH 090/190] chore: rename tsconfig files --- .../{tsconfig.lib.temp => tsconfig.lib.json} | 0 .../{tsconfig.lib.prod.temp => tsconfig.lib.prod.json} | 0 .../{tsconfig.spec.temp => tsconfig.spec.json} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename npm/ng-packs/source-code-requirements/{tsconfig.lib.temp => tsconfig.lib.json} (100%) rename npm/ng-packs/source-code-requirements/{tsconfig.lib.prod.temp => tsconfig.lib.prod.json} (100%) rename npm/ng-packs/source-code-requirements/{tsconfig.spec.temp => tsconfig.spec.json} (100%) diff --git a/npm/ng-packs/source-code-requirements/tsconfig.lib.temp b/npm/ng-packs/source-code-requirements/tsconfig.lib.json similarity index 100% rename from npm/ng-packs/source-code-requirements/tsconfig.lib.temp rename to npm/ng-packs/source-code-requirements/tsconfig.lib.json diff --git a/npm/ng-packs/source-code-requirements/tsconfig.lib.prod.temp b/npm/ng-packs/source-code-requirements/tsconfig.lib.prod.json similarity index 100% rename from npm/ng-packs/source-code-requirements/tsconfig.lib.prod.temp rename to npm/ng-packs/source-code-requirements/tsconfig.lib.prod.json diff --git a/npm/ng-packs/source-code-requirements/tsconfig.spec.temp b/npm/ng-packs/source-code-requirements/tsconfig.spec.json similarity index 100% rename from npm/ng-packs/source-code-requirements/tsconfig.spec.temp rename to npm/ng-packs/source-code-requirements/tsconfig.spec.json From 58c17ceae04f4edad87cf0d5cad4da65ca8c8eab Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 26 Jun 2020 19:29:24 +0800 Subject: [PATCH 091/190] Rename GetAndRefreshMany to PipelineRefreshManyAndOutData --- .../StackExchangeRedis/AbpRedisCache.cs | 56 +++++++++---------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs index e02619bc6e..6d59b6fc64 100644 --- a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs +++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs @@ -77,7 +77,7 @@ namespace Volo.Abp.Caching.StackExchangeRedis SlidingExpirationKey); } - Task.WaitAll(GetAndRefreshMany(keyArray, results, out var bytes)); + Task.WaitAll(PipelineRefreshManyAndOutData(keyArray, results, out var bytes)); return bytes; } @@ -105,12 +105,15 @@ namespace Volo.Abp.Caching.StackExchangeRedis SlidingExpirationKey); } - await Task.WhenAll(GetAndRefreshMany(keyArray, results, out var bytes)); + await Task.WhenAll(PipelineRefreshManyAndOutData(keyArray, results, out var bytes)); return bytes; } - private Task[] GetAndRefreshMany(string[] keys, RedisValue[][] results, out byte[][] bytes) + private Task[] PipelineRefreshManyAndOutData( + string[] keys, + RedisValue[][] results, + out byte[][] bytes) { bytes = new byte[keys.Length][]; var tasks = new Task[keys.Length]; @@ -119,7 +122,27 @@ namespace Volo.Abp.Caching.StackExchangeRedis if (results[i].Length >= 2) { MapMetadata(results[i], out DateTimeOffset? absExpr, out TimeSpan? sldExpr); - tasks[i] = PipelineRefresh(keys[i], absExpr, sldExpr); + + if (sldExpr.HasValue) + { + TimeSpan? expr; + + if (absExpr.HasValue) + { + var relExpr = absExpr.Value - DateTimeOffset.Now; + expr = relExpr <= sldExpr.Value ? relExpr : sldExpr; + } + else + { + expr = sldExpr; + } + + tasks[i] = Cache.KeyExpireAsync(keys[i], expr); + } + else + { + tasks[i] = Task.CompletedTask; + } } if (results[i].Length >= 3 && results[i][2].HasValue) @@ -135,31 +158,6 @@ namespace Volo.Abp.Caching.StackExchangeRedis return tasks; } - private Task PipelineRefresh( - string key, - DateTimeOffset? absExpr, - TimeSpan? sldExpr) - { - if (sldExpr.HasValue) - { - TimeSpan? expr; - - if (absExpr.HasValue) - { - var relExpr = absExpr.Value - DateTimeOffset.Now; - expr = relExpr <= sldExpr.Value ? relExpr : sldExpr; - } - else - { - expr = sldExpr; - } - - return Cache.KeyExpireAsync(key, expr); - } - - return Task.CompletedTask; - } - private Task[] PipelineSetMany( IEnumerable> items, DistributedCacheEntryOptions options) From 096f8f075034945963c004a73572edb9d8257ba4 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 26 Jun 2020 20:19:02 +0800 Subject: [PATCH 092/190] Use pipeline instead of lua script --- .../StackExchangeRedis/AbpRedisExtensions.cs | 39 +++++++++++-------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisExtensions.cs b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisExtensions.cs index d3466d2222..ad077a7440 100644 --- a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisExtensions.cs +++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisExtensions.cs @@ -6,24 +6,26 @@ namespace Volo.Abp.Caching.StackExchangeRedis { public static class AbpRedisExtensions { - private const string HmGetManyScript = (@" - local res = {}; - for i , key in ipairs(KEYS) do - res[#res+1] = redis.call('HMGET', key,unpack(ARGV)) - end - return res"); - public static RedisValue[][] HashMemberGetMany( this IDatabase cache, string[] keys, params string[] members) { - var results = cache.ScriptEvaluate( - HmGetManyScript, - keys.Select(key => (RedisKey) key).ToArray(), - members.Select(member => (RedisValue) member).ToArray()); + var tasks = new Task[keys.Length]; + var fields = members.Select(member => (RedisValue) member).ToArray(); + var results = new RedisValue[keys.Length][]; + + for (var i = 0; i < keys.Length; i++) + { + tasks[i] = cache.HashGetAsync((RedisKey) keys[i], fields); + } - return ((RedisResult[]) results).Select(result => (RedisValue[]) result).ToArray(); + for (var i = 0; i < tasks.Length; i++) + { + results[i] = cache.Wait(tasks[i]); + } + + return results; } public static async Task HashMemberGetManyAsync( @@ -31,12 +33,15 @@ namespace Volo.Abp.Caching.StackExchangeRedis string[] keys, params string[] members) { - var results = await cache.ScriptEvaluateAsync( - HmGetManyScript, - keys.Select(key => (RedisKey) key).ToArray(), - members.Select(member => (RedisValue) member).ToArray()); + var tasks = new Task[keys.Length]; + var fields = members.Select(member => (RedisValue) member).ToArray(); + + for (var i = 0; i < keys.Length; i++) + { + tasks[i] = cache.HashGetAsync((RedisKey) keys[i], fields); + } - return ((RedisResult[]) results).Select(result => (RedisValue[]) result).ToArray(); + return await Task.WhenAll(tasks); } } } From fff0a6f5557dc49e955d9d159c8a6fcd11e1bbbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 26 Jun 2020 16:01:08 +0300 Subject: [PATCH 093/190] Resolved #4503: Introduce @libs/uppy npm package. --- .../Mvc/UI/Packages/Uppy/UppyScriptContributor.cs | 13 +++++++++++++ .../Mvc/UI/Packages/Uppy/UppyStyleContributor.cs | 13 +++++++++++++ npm/packs/uppy/abp.resourcemapping.js | 5 +++++ npm/packs/uppy/package.json | 12 ++++++++++++ 4 files changed, 43 insertions(+) create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/Uppy/UppyScriptContributor.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/Uppy/UppyStyleContributor.cs create mode 100644 npm/packs/uppy/abp.resourcemapping.js create mode 100644 npm/packs/uppy/package.json diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/Uppy/UppyScriptContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/Uppy/UppyScriptContributor.cs new file mode 100644 index 0000000000..691f377c6c --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/Uppy/UppyScriptContributor.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Packages.Uppy +{ + public class UppyScriptContributor : BundleContributor + { + public override void ConfigureBundle(BundleConfigurationContext context) + { + context.Files.AddIfNotContains("/libs/uppy/uppy.min.js"); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/Uppy/UppyStyleContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/Uppy/UppyStyleContributor.cs new file mode 100644 index 0000000000..c10509515d --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/Uppy/UppyStyleContributor.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Packages.Uppy +{ + public class UppyStyleContributor : BundleContributor + { + public override void ConfigureBundle(BundleConfigurationContext context) + { + context.Files.AddIfNotContains("/libs/uppy/uppy.min.css"); + } + } +} \ No newline at end of file diff --git a/npm/packs/uppy/abp.resourcemapping.js b/npm/packs/uppy/abp.resourcemapping.js new file mode 100644 index 0000000000..8af675eb65 --- /dev/null +++ b/npm/packs/uppy/abp.resourcemapping.js @@ -0,0 +1,5 @@ +module.exports = { + mappings: { + "@node_modules/uppy/dist/*.*": "@libs/uppy/" + } +} \ No newline at end of file diff --git a/npm/packs/uppy/package.json b/npm/packs/uppy/package.json new file mode 100644 index 0000000000..93b3c4fce7 --- /dev/null +++ b/npm/packs/uppy/package.json @@ -0,0 +1,12 @@ +{ + "version": "2.9.0", + "name": "@abp/uppy", + "publishConfig": { + "access": "public" + }, + "dependencies": { + "@abp/core": "^2.9.0", + "uppy": "^1.16.1" + }, + "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" +} From 58cb055a994bdcf2dd29d09487eb9f04b3d8e83f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 26 Jun 2020 21:44:57 +0300 Subject: [PATCH 094/190] Reduce reflection for the AbpRedisCache --- .../StackExchangeRedis/AbpRedisCache.cs | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs index a5236022f3..6b523a43dc 100644 --- a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs +++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs @@ -16,8 +16,9 @@ namespace Volo.Abp.Caching.StackExchangeRedis private static readonly MethodInfo ConnectMethod; private static readonly MethodInfo ConnectAsyncMethod; - protected IDatabase RedisDatabase => RedisDatabaseField.GetValue(this) as IDatabase; - + protected IDatabase RedisDatabase => GetRedisDatabase(); + private IDatabase _redisDatabase; + static AbpRedisCache() { RedisDatabaseField = typeof(RedisCache) @@ -38,12 +39,32 @@ namespace Volo.Abp.Caching.StackExchangeRedis protected virtual void Connect() { + if (GetRedisDatabase() != null) + { + return; + } + ConnectMethod.Invoke(this, Array.Empty()); } protected virtual Task ConnectAsync(CancellationToken token = default) { + if (GetRedisDatabase() != null) + { + return Task.CompletedTask; + } + return (Task) ConnectAsyncMethod.Invoke(this, new object[] {token}); } + + private IDatabase GetRedisDatabase() + { + if (_redisDatabase == null) + { + _redisDatabase = RedisDatabaseField.GetValue(this) as IDatabase; + } + + return _redisDatabase; + } } } \ No newline at end of file From b273d1944c3c1ae293763b7664dc1ebc5bc5dd73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 26 Jun 2020 22:42:53 +0300 Subject: [PATCH 095/190] Add a safe point to override max lengths for existing properties. --- .../MyProjectNameDomainSharedModule.cs | 5 +++ ...yProjectNameModuleExtensionConfigurator.cs | 35 +++++++++++++++++++ ...rojectNameEfCoreEntityExtensionMappings.cs | 2 ++ 3 files changed, 42 insertions(+) create mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameModuleExtensionConfigurator.cs diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs index d10c63986d..340d28ac3a 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs @@ -26,6 +26,11 @@ namespace MyCompanyName.MyProjectName )] public class MyProjectNameDomainSharedModule : AbpModule { + public override void PreConfigureServices(ServiceConfigurationContext context) + { + MyProjectNameModulePropertyConfigurator.Configure(); + } + public override void ConfigureServices(ServiceConfigurationContext context) { Configure(options => diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameModuleExtensionConfigurator.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameModuleExtensionConfigurator.cs new file mode 100644 index 0000000000..ce3de2992f --- /dev/null +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameModuleExtensionConfigurator.cs @@ -0,0 +1,35 @@ +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Identity; +using Volo.Abp.ObjectExtending; +using Volo.Abp.Threading; + +namespace MyCompanyName.MyProjectName +{ + public static class MyProjectNameModulePropertyConfigurator + { + private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); + + public static void Configure() + { + OneTimeRunner.Run(() => + { + ConfigureExistingProperties(); + }); + } + + private static void ConfigureExistingProperties() + { + /* You can change max lengths for properties of the + * entities defined in the modules used by your application. + * + * Example: Change user and role name max lengths + + IdentityUserConsts.MaxNameLength = 99; + IdentityRoleConsts.MaxNameLength = 99; + + * Notice: It is not suggested to change property lengths + * unless you really need it. Go with the standard values wherever possible. + */ + } + } +} \ No newline at end of file diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameEfCoreEntityExtensionMappings.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameEfCoreEntityExtensionMappings.cs index 12fb8eefc6..0b19050cb0 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameEfCoreEntityExtensionMappings.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameEfCoreEntityExtensionMappings.cs @@ -10,6 +10,8 @@ namespace MyCompanyName.MyProjectName.EntityFrameworkCore public static void Configure() { + MyProjectNameModulePropertyConfigurator.Configure(); + OneTimeRunner.Run(() => { /* You can configure entity extension properties for the From 018e7cbd0807b5bda5b23654de2a7ab7d3d8a707 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Sat, 27 Jun 2020 10:23:56 +0800 Subject: [PATCH 096/190] Refactored --- .../Caching/StackExchangeRedis/RedisCache.cs | 496 ------------------ .../StackExchangeRedis/RedisExtensions.cs | 70 --- .../StackExchangeRedis/AbpRedisCache.cs | 116 +++- 3 files changed, 106 insertions(+), 576 deletions(-) delete mode 100644 framework/src/Volo.Abp.Caching.StackExchangeRedis/Microsoft/Extensions/Caching/StackExchangeRedis/RedisCache.cs delete mode 100644 framework/src/Volo.Abp.Caching.StackExchangeRedis/Microsoft/Extensions/Caching/StackExchangeRedis/RedisExtensions.cs diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Microsoft/Extensions/Caching/StackExchangeRedis/RedisCache.cs b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Microsoft/Extensions/Caching/StackExchangeRedis/RedisCache.cs deleted file mode 100644 index 32cc85011b..0000000000 --- a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Microsoft/Extensions/Caching/StackExchangeRedis/RedisCache.cs +++ /dev/null @@ -1,496 +0,0 @@ -// This software is part of the DOTNET extensions -// Copyright (c) .NET Foundation and Contributors -// https://dotnet.microsoft.com/ -// -// All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -using System; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.Caching.Distributed; -using Microsoft.Extensions.Options; -using StackExchange.Redis; - -namespace Microsoft.Extensions.Caching.StackExchangeRedis -{ - public class RedisCache : IDistributedCache, IDisposable - { - // KEYS[1] = = key - // ARGV[1] = absolute-expiration - ticks as long (-1 for none) - // ARGV[2] = sliding-expiration - ticks as long (-1 for none) - // ARGV[3] = relative-expiration (long, in seconds, -1 for none) - Min(absolute-expiration - Now, sliding-expiration) - // ARGV[4] = data - byte[] - // this order should not change LUA script depends on it - protected const string SetScript = (@" - redis.call('HMSET', KEYS[1], 'absexp', ARGV[1], 'sldexp', ARGV[2], 'data', ARGV[4]) - if ARGV[3] ~= '-1' then - redis.call('EXPIRE', KEYS[1], ARGV[3]) - end - return 1"); - - protected const string AbsoluteExpirationKey = "absexp"; - protected const string SlidingExpirationKey = "sldexp"; - protected const string DataKey = "data"; - protected const long NotPresent = -1; - - protected volatile ConnectionMultiplexer Connection; - protected IDatabase Cache; - - protected readonly RedisCacheOptions Options; - protected readonly string Instance; - - protected readonly SemaphoreSlim ConnectionLock = new SemaphoreSlim(initialCount: 1, maxCount: 1); - - public RedisCache(IOptions optionsAccessor) - { - if (optionsAccessor == null) - { - throw new ArgumentNullException(nameof(optionsAccessor)); - } - - Options = optionsAccessor.Value; - - // This allows partitioning a single backend cache for use with multiple apps/services. - Instance = Options.InstanceName ?? string.Empty; - } - - public virtual byte[] Get(string key) - { - if (key == null) - { - throw new ArgumentNullException(nameof(key)); - } - - return GetAndRefresh(key, getData: true); - } - - public virtual async Task GetAsync( - string key, - CancellationToken token = default) - { - if (key == null) - { - throw new ArgumentNullException(nameof(key)); - } - - token.ThrowIfCancellationRequested(); - - return await GetAndRefreshAsync(key, getData: true, token: token); - } - - public virtual void Set( - string key, - byte[] value, - DistributedCacheEntryOptions options) - { - if (key == null) - { - throw new ArgumentNullException(nameof(key)); - } - - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (options == null) - { - throw new ArgumentNullException(nameof(options)); - } - - Connect(); - - var creationTime = DateTimeOffset.UtcNow; - - var absoluteExpiration = GetAbsoluteExpiration(creationTime, options); - - Cache.ScriptEvaluate(SetScript, new RedisKey[] {Instance + key}, - new RedisValue[] - { - absoluteExpiration?.Ticks ?? NotPresent, - options.SlidingExpiration?.Ticks ?? NotPresent, - GetExpirationInSeconds(creationTime, absoluteExpiration, options) ?? NotPresent, - value - }); - } - - public virtual async Task SetAsync( - string key, - byte[] value, - DistributedCacheEntryOptions options, - CancellationToken token = default) - { - if (key == null) - { - throw new ArgumentNullException(nameof(key)); - } - - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (options == null) - { - throw new ArgumentNullException(nameof(options)); - } - - token.ThrowIfCancellationRequested(); - - await ConnectAsync(token); - - var creationTime = DateTimeOffset.UtcNow; - - var absoluteExpiration = GetAbsoluteExpiration(creationTime, options); - - await Cache.ScriptEvaluateAsync(SetScript, new RedisKey[] {Instance + key}, - new RedisValue[] - { - absoluteExpiration?.Ticks ?? NotPresent, - options.SlidingExpiration?.Ticks ?? NotPresent, - GetExpirationInSeconds(creationTime, absoluteExpiration, options) ?? NotPresent, - value - }); - } - - public virtual void Refresh(string key) - { - if (key == null) - { - throw new ArgumentNullException(nameof(key)); - } - - GetAndRefresh(key, getData: false); - } - - public virtual async Task RefreshAsync( - string key, - CancellationToken token = default) - { - if (key == null) - { - throw new ArgumentNullException(nameof(key)); - } - - token.ThrowIfCancellationRequested(); - - await GetAndRefreshAsync(key, getData: false, token: token); - } - - protected virtual void Connect() - { - if (Cache != null) - { - return; - } - - ConnectionLock.Wait(); - try - { - if (Cache == null) - { - if (Options.ConfigurationOptions != null) - { - Connection = ConnectionMultiplexer.Connect(Options.ConfigurationOptions); - } - else - { - Connection = ConnectionMultiplexer.Connect(Options.Configuration); - } - - Cache = Connection.GetDatabase(); - } - } - finally - { - ConnectionLock.Release(); - } - } - - protected virtual async Task ConnectAsync(CancellationToken token = default) - { - token.ThrowIfCancellationRequested(); - - if (Cache != null) - { - return; - } - - await ConnectionLock.WaitAsync(token); - try - { - if (Cache == null) - { - if (Options.ConfigurationOptions != null) - { - Connection = await ConnectionMultiplexer.ConnectAsync(Options.ConfigurationOptions); - } - else - { - Connection = await ConnectionMultiplexer.ConnectAsync(Options.Configuration); - } - - Cache = Connection.GetDatabase(); - } - } - finally - { - ConnectionLock.Release(); - } - } - - protected virtual byte[] GetAndRefresh(string key, bool getData) - { - if (key == null) - { - throw new ArgumentNullException(nameof(key)); - } - - Connect(); - - // This also resets the LRU status as desired. - // TODO: Can this be done in one operation on the server side? Probably, the trick would just be the DateTimeOffset math. - RedisValue[] results; - if (getData) - { - results = Cache.HashMemberGet(Instance + key, AbsoluteExpirationKey, SlidingExpirationKey, DataKey); - } - else - { - results = Cache.HashMemberGet(Instance + key, AbsoluteExpirationKey, SlidingExpirationKey); - } - - // TODO: Error handling - if (results.Length >= 2) - { - MapMetadata(results, out DateTimeOffset? absExpr, out TimeSpan? sldExpr); - Refresh(key, absExpr, sldExpr); - } - - if (results.Length >= 3 && results[2].HasValue) - { - return results[2]; - } - - return null; - } - - protected virtual async Task GetAndRefreshAsync( - string key, - bool getData, - CancellationToken token = default) - { - if (key == null) - { - throw new ArgumentNullException(nameof(key)); - } - - token.ThrowIfCancellationRequested(); - - await ConnectAsync(token); - - // This also resets the LRU status as desired. - // TODO: Can this be done in one operation on the server side? Probably, the trick would just be the DateTimeOffset math. - RedisValue[] results; - if (getData) - { - results = await Cache.HashMemberGetAsync(Instance + key, AbsoluteExpirationKey, SlidingExpirationKey, - DataKey); - } - else - { - results = await Cache.HashMemberGetAsync(Instance + key, AbsoluteExpirationKey, SlidingExpirationKey); - } - - // TODO: Error handling - if (results.Length >= 2) - { - MapMetadata(results, out DateTimeOffset? absExpr, out TimeSpan? sldExpr); - await RefreshAsync(key, absExpr, sldExpr, token); - } - - if (results.Length >= 3 && results[2].HasValue) - { - return results[2]; - } - - return null; - } - - public virtual void Remove(string key) - { - if (key == null) - { - throw new ArgumentNullException(nameof(key)); - } - - Connect(); - - Cache.KeyDelete(Instance + key); - // TODO: Error handling - } - - public virtual async Task RemoveAsync( - string key, - CancellationToken token = default) - { - if (key == null) - { - throw new ArgumentNullException(nameof(key)); - } - - await ConnectAsync(token); - - await Cache.KeyDeleteAsync(Instance + key); - // TODO: Error handling - } - - protected virtual void MapMetadata( - RedisValue[] results, - out DateTimeOffset? absoluteExpiration, - out TimeSpan? slidingExpiration) - { - absoluteExpiration = null; - slidingExpiration = null; - var absoluteExpirationTicks = (long?) results[0]; - if (absoluteExpirationTicks.HasValue && absoluteExpirationTicks.Value != NotPresent) - { - absoluteExpiration = new DateTimeOffset(absoluteExpirationTicks.Value, TimeSpan.Zero); - } - - var slidingExpirationTicks = (long?) results[1]; - if (slidingExpirationTicks.HasValue && slidingExpirationTicks.Value != NotPresent) - { - slidingExpiration = new TimeSpan(slidingExpirationTicks.Value); - } - } - - protected virtual void Refresh( - string key, - DateTimeOffset? absExpr, - TimeSpan? sldExpr) - { - if (key == null) - { - throw new ArgumentNullException(nameof(key)); - } - - // Note Refresh has no effect if there is just an absolute expiration (or neither). - TimeSpan? expr = null; - if (sldExpr.HasValue) - { - if (absExpr.HasValue) - { - var relExpr = absExpr.Value - DateTimeOffset.Now; - expr = relExpr <= sldExpr.Value ? relExpr : sldExpr; - } - else - { - expr = sldExpr; - } - - Cache.KeyExpire(Instance + key, expr); - // TODO: Error handling - } - } - - protected virtual async Task RefreshAsync( - string key, - DateTimeOffset? absExpr, - TimeSpan? sldExpr, - CancellationToken token = default) - { - if (key == null) - { - throw new ArgumentNullException(nameof(key)); - } - - token.ThrowIfCancellationRequested(); - - // Note Refresh has no effect if there is just an absolute expiration (or neither). - TimeSpan? expr = null; - if (sldExpr.HasValue) - { - if (absExpr.HasValue) - { - var relExpr = absExpr.Value - DateTimeOffset.Now; - expr = relExpr <= sldExpr.Value ? relExpr : sldExpr; - } - else - { - expr = sldExpr; - } - - await Cache.KeyExpireAsync(Instance + key, expr); - // TODO: Error handling - } - } - - protected static long? GetExpirationInSeconds( - DateTimeOffset creationTime, - DateTimeOffset? absoluteExpiration, - DistributedCacheEntryOptions options) - { - if (absoluteExpiration.HasValue && options.SlidingExpiration.HasValue) - { - return (long) Math.Min( - (absoluteExpiration.Value - creationTime).TotalSeconds, - options.SlidingExpiration.Value.TotalSeconds); - } - else if (absoluteExpiration.HasValue) - { - return (long) (absoluteExpiration.Value - creationTime).TotalSeconds; - } - else if (options.SlidingExpiration.HasValue) - { - return (long) options.SlidingExpiration.Value.TotalSeconds; - } - - return null; - } - - protected static DateTimeOffset? GetAbsoluteExpiration( - DateTimeOffset creationTime, - DistributedCacheEntryOptions options) - { - if (options.AbsoluteExpiration.HasValue && options.AbsoluteExpiration <= creationTime) - { - throw new ArgumentOutOfRangeException( - nameof(DistributedCacheEntryOptions.AbsoluteExpiration), - options.AbsoluteExpiration.Value, - "The absolute expiration value must be in the future."); - } - - var absoluteExpiration = options.AbsoluteExpiration; - if (options.AbsoluteExpirationRelativeToNow.HasValue) - { - absoluteExpiration = creationTime + options.AbsoluteExpirationRelativeToNow; - } - - return absoluteExpiration; - } - - public virtual void Dispose() - { - Connection?.Close(); - } - } -} diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Microsoft/Extensions/Caching/StackExchangeRedis/RedisExtensions.cs b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Microsoft/Extensions/Caching/StackExchangeRedis/RedisExtensions.cs deleted file mode 100644 index c83c8df7ff..0000000000 --- a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Microsoft/Extensions/Caching/StackExchangeRedis/RedisExtensions.cs +++ /dev/null @@ -1,70 +0,0 @@ -// This software is part of the DOTNET extensions -// Copyright (c) .NET Foundation and Contributors -// https://dotnet.microsoft.com/ -// -// All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -using System.Threading.Tasks; -using StackExchange.Redis; - -namespace Microsoft.Extensions.Caching.StackExchangeRedis -{ - internal static class RedisExtensions - { - private const string HmGetScript = (@"return redis.call('HMGET', KEYS[1], unpack(ARGV))"); - - internal static RedisValue[] HashMemberGet(this IDatabase cache, string key, params string[] members) - { - var result = cache.ScriptEvaluate( - HmGetScript, - new RedisKey[] { key }, - GetRedisMembers(members)); - - // TODO: Error checking? - return (RedisValue[])result; - } - - internal static async Task HashMemberGetAsync( - this IDatabase cache, - string key, - params string[] members) - { - var result = await cache.ScriptEvaluateAsync( - HmGetScript, - new RedisKey[] { key }, - GetRedisMembers(members)).ConfigureAwait(false); - - // TODO: Error checking? - return (RedisValue[])result; - } - - private static RedisValue[] GetRedisMembers(params string[] members) - { - var redisMembers = new RedisValue[members.Length]; - for (int i = 0; i < members.Length; i++) - { - redisMembers[i] = (RedisValue)members[i]; - } - - return redisMembers; - } - } -} diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs index 86fd3441ab..c3cb34f30c 100644 --- a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs +++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Caching.Distributed; @@ -14,9 +15,75 @@ namespace Volo.Abp.Caching.StackExchangeRedis [DisableConventionalRegistration] public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems { + protected static readonly string SetScript; + protected static readonly string AbsoluteExpirationKey; + protected static readonly string SlidingExpirationKey; + protected static readonly string DataKey; + protected static readonly long NotPresent; + + private static readonly FieldInfo RedisDatabaseField; + private static readonly MethodInfo ConnectMethod; + private static readonly MethodInfo ConnectAsyncMethod; + private static readonly MethodInfo MapMetadataMethod; + private static readonly MethodInfo GetAbsoluteExpirationMethod; + private static readonly MethodInfo GetExpirationInSecondsMethod; + + protected IDatabase RedisDatabase => GetRedisDatabase(); + private IDatabase _redisDatabase; + + protected string Instance { get; } + + static AbpRedisCache() + { + var type = typeof(RedisCache); + + RedisDatabaseField = type.GetField("_cache", BindingFlags.Instance | BindingFlags.NonPublic); + + ConnectMethod = type.GetMethod("Connect", BindingFlags.Instance | BindingFlags.NonPublic); + + ConnectAsyncMethod = type.GetMethod("ConnectAsync", BindingFlags.Instance | BindingFlags.NonPublic); + + MapMetadataMethod = type.GetMethod("MapMetadata", BindingFlags.Instance | BindingFlags.NonPublic); + + GetAbsoluteExpirationMethod = type.GetMethod("GetAbsoluteExpiration", BindingFlags.Static | BindingFlags.NonPublic); + + GetExpirationInSecondsMethod = type.GetMethod("GetExpirationInSeconds", BindingFlags.Static | BindingFlags.NonPublic); + + SetScript = type.GetField("SetScript", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null).ToString(); + + AbsoluteExpirationKey = type.GetField("AbsoluteExpirationKey", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null).ToString(); + + SlidingExpirationKey = type.GetField("SlidingExpirationKey", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null).ToString(); + + DataKey = type.GetField("DataKey", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null).ToString(); + + NotPresent = type.GetField("NotPresent", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null).To(); + } + public AbpRedisCache(IOptions optionsAccessor) : base(optionsAccessor) { + Instance = optionsAccessor.Value.InstanceName ?? string.Empty; + } + + protected virtual void Connect() + { + if (GetRedisDatabase() != null) + { + return; + } + + ConnectMethod.Invoke(this, Array.Empty()); + } + + protected virtual Task ConnectAsync(CancellationToken token = default) + { + if (GetRedisDatabase() != null) + { + return Task.CompletedTask; + } + + return (Task) ConnectAsyncMethod.Invoke(this, new object[] {token}); } public byte[][] GetMany( @@ -68,12 +135,12 @@ namespace Volo.Abp.Caching.StackExchangeRedis if (getData) { - results = Cache.HashMemberGetMany(keyArray, AbsoluteExpirationKey, + results = RedisDatabase.HashMemberGetMany(keyArray, AbsoluteExpirationKey, SlidingExpirationKey, DataKey); } else { - results = Cache.HashMemberGetMany(keyArray, AbsoluteExpirationKey, + results = RedisDatabase.HashMemberGetMany(keyArray, AbsoluteExpirationKey, SlidingExpirationKey); } @@ -96,12 +163,12 @@ namespace Volo.Abp.Caching.StackExchangeRedis if (getData) { - results = await Cache.HashMemberGetManyAsync(keyArray, AbsoluteExpirationKey, + results = await RedisDatabase.HashMemberGetManyAsync(keyArray, AbsoluteExpirationKey, SlidingExpirationKey, DataKey); } else { - results = await Cache.HashMemberGetManyAsync(keyArray, AbsoluteExpirationKey, + results = await RedisDatabase.HashMemberGetManyAsync(keyArray, AbsoluteExpirationKey, SlidingExpirationKey); } @@ -110,13 +177,14 @@ namespace Volo.Abp.Caching.StackExchangeRedis return bytes; } - private Task[] PipelineRefreshManyAndOutData( + protected virtual Task[] PipelineRefreshManyAndOutData( string[] keys, RedisValue[][] results, out byte[][] bytes) { bytes = new byte[keys.Length][]; var tasks = new Task[keys.Length]; + for (var i = 0; i < keys.Length; i++) { if (results[i].Length >= 2) @@ -137,7 +205,7 @@ namespace Volo.Abp.Caching.StackExchangeRedis expr = sldExpr; } - tasks[i] = Cache.KeyExpireAsync(keys[i], expr); + tasks[i] = RedisDatabase.KeyExpireAsync(keys[i], expr); } else { @@ -158,7 +226,7 @@ namespace Volo.Abp.Caching.StackExchangeRedis return tasks; } - private Task[] PipelineSetMany( + protected virtual Task[] PipelineSetMany( IEnumerable> items, DistributedCacheEntryOptions options) { @@ -172,7 +240,7 @@ namespace Volo.Abp.Caching.StackExchangeRedis for (var i = 0; i < itemArray.Length; i++) { - tasks[i] = Cache.ScriptEvaluateAsync(SetScript, new RedisKey[] {Instance + itemArray[i].Key}, + tasks[i] = RedisDatabase.ScriptEvaluateAsync(SetScript, new RedisKey[] {Instance + itemArray[i].Key}, new RedisValue[] { absoluteExpiration?.Ticks ?? NotPresent, @@ -184,12 +252,40 @@ namespace Volo.Abp.Caching.StackExchangeRedis return tasks; } - + + protected virtual void MapMetadata( + RedisValue[] results, + out DateTimeOffset? absoluteExpiration, + out TimeSpan? slidingExpiration) + { + var parameters = new object[] {results, null, null}; + MapMetadataMethod.Invoke(this, parameters); + + absoluteExpiration = (DateTimeOffset?) parameters[1]; + slidingExpiration = (TimeSpan?) parameters[2]; + } + + protected virtual long? GetExpirationInSeconds( + DateTimeOffset creationTime, + DateTimeOffset? absoluteExpiration, + DistributedCacheEntryOptions options) + { + return (long?) GetExpirationInSecondsMethod.Invoke(null, + new object[] {creationTime, absoluteExpiration, options}); + } + + protected virtual DateTimeOffset? GetAbsoluteExpiration( + DateTimeOffset creationTime, + DistributedCacheEntryOptions options) + { + return (DateTimeOffset?) GetAbsoluteExpirationMethod.Invoke(null, new object[] {creationTime, options}); + } + private IDatabase GetRedisDatabase() { if (_redisDatabase == null) { - _redisDatabase = RedisDatabaseField.GetValue(this) as IDatabase; + _redisDatabase = RedisDatabaseField.GetValue(this) as IDatabase; } return _redisDatabase; From 1c34d8be437e5d51c56c7177fb0c8a0844239981 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Sat, 27 Jun 2020 11:57:51 +0800 Subject: [PATCH 097/190] Add PeriodicBackgroundworker quartz adapter --- .../AbpBackgroundWorkersQuartzModule.cs | 6 ++ .../Quartz/IQuartzBackgroundWorkerAdapter.cs | 7 ++ .../Quartz/QuartzBackgroundWorkerAdapter.cs | 87 +++++++++++++++++++ .../Quartz/QuartzBackgroundWorkerManager.cs | 18 +++- 4 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/IQuartzBackgroundWorkerAdapter.cs create mode 100644 framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerAdapter.cs diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs index 7823502013..9cfc748c4e 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs @@ -1,6 +1,7 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; using Volo.Abp.Modularity; using Volo.Abp.Quartz; @@ -18,6 +19,11 @@ namespace Volo.Abp.BackgroundWorkers.Quartz context.Services.AddConventionalRegistrar(new AbpQuartzConventionalRegistrar()); } + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddSingleton(typeof(QuartzPeriodicBackgroundWorkerAdapter<>)); + } + public override void OnPreApplicationInitialization(ApplicationInitializationContext context) { var options = context.ServiceProvider.GetService>().Value; diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/IQuartzBackgroundWorkerAdapter.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/IQuartzBackgroundWorkerAdapter.cs new file mode 100644 index 0000000000..dd6a3019b2 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/IQuartzBackgroundWorkerAdapter.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.BackgroundWorkers.Quartz +{ + public interface IQuartzBackgroundWorkerAdapter : IQuartzBackgroundWorker + { + void BuildWorker(IBackgroundWorker worker); + } +} diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerAdapter.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerAdapter.cs new file mode 100644 index 0000000000..02caffa80c --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerAdapter.cs @@ -0,0 +1,87 @@ +using System; +using System.Reflection; +using System.Threading.Tasks; +using Quartz; +using Volo.Abp.Threading; + +namespace Volo.Abp.BackgroundWorkers.Quartz +{ + public class QuartzPeriodicBackgroundWorkerAdapter : QuartzBackgroundWorkerBase, + IQuartzBackgroundWorkerAdapter + where TWorker : IBackgroundWorker + { + public QuartzPeriodicBackgroundWorkerAdapter() + { + AutoRegister = false; + } + + public void BuildWorker(IBackgroundWorker worker) + { + int? period; + var workerType = worker.GetType(); + + if (worker is AsyncPeriodicBackgroundWorkerBase || worker is PeriodicBackgroundWorkerBase) + { + if (typeof(TWorker) != worker.GetType()) + { + throw new ArgumentException($"{nameof(worker)} type is different from the generic type"); + } + + var timer = (AbpTimer) worker.GetType().GetProperty("Timer", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(worker); + period = timer?.Period; + } + else + { + return; + } + + if (period == null) + { + return; + } + + JobDetail = JobBuilder + .Create>() + .WithIdentity(workerType.FullName) + .Build(); + Trigger = TriggerBuilder.Create() + .WithIdentity(workerType.FullName) + .WithSimpleSchedule(builder => builder.WithInterval(TimeSpan.FromMilliseconds(period.Value)).RepeatForever()) + .Build(); + } + + public override async Task Execute(IJobExecutionContext context) + { + var worker = (IBackgroundWorker) ServiceProvider.GetService(typeof(TWorker)); + var workerContext = new PeriodicBackgroundWorkerContext(ServiceProvider); + + switch (worker) + { + case AsyncPeriodicBackgroundWorkerBase asyncWorker: + { + var doWorkAsyncMethod = asyncWorker.GetType() + .GetMethod("DoWorkAsync", BindingFlags.Instance | BindingFlags.NonPublic); + + if (doWorkAsyncMethod != null) + { + await (Task) doWorkAsyncMethod.Invoke(asyncWorker, new object[] {workerContext}); + } + + break; + } + case PeriodicBackgroundWorkerBase syncWorker: + { + var doWorkMethod = syncWorker.GetType() + .GetMethod("DoWork", BindingFlags.Instance | BindingFlags.NonPublic); + + if (doWorkMethod != null) + { + doWorkMethod.Invoke(syncWorker, new object[] {workerContext}); + } + + break; + } + } + } + } +} diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs index 35359b1d27..d670c1db98 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs @@ -1,4 +1,5 @@ -using System.Threading; +using System; +using System.Threading; using System.Threading.Tasks; using Quartz; using Volo.Abp.DependencyInjection; @@ -50,6 +51,19 @@ namespace Volo.Abp.BackgroundWorkers.Quartz await DefaultScheduleJobAsync(quartzWork); } } + else + { + var adapterType = typeof(QuartzPeriodicBackgroundWorkerAdapter<>).MakeGenericType(worker.GetType()); + + var workerAdapter = Activator.CreateInstance(adapterType) as IQuartzBackgroundWorkerAdapter; + + workerAdapter?.BuildWorker(worker); + + if (workerAdapter?.Trigger != null) + { + await DefaultScheduleJobAsync(workerAdapter); + } + } } protected virtual async Task DefaultScheduleJobAsync(IQuartzBackgroundWorker quartzWork) @@ -66,4 +80,4 @@ namespace Volo.Abp.BackgroundWorkers.Quartz } } } -} \ No newline at end of file +} From acb69ec6df90a0436fb7df0d3be7685704f033af Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Sat, 27 Jun 2020 12:14:51 +0800 Subject: [PATCH 098/190] Optimize --- .../Quartz/QuartzBackgroundWorkerAdapter.cs | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerAdapter.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerAdapter.cs index 02caffa80c..96cf3988bd 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerAdapter.cs @@ -10,9 +10,16 @@ namespace Volo.Abp.BackgroundWorkers.Quartz IQuartzBackgroundWorkerAdapter where TWorker : IBackgroundWorker { + private readonly MethodInfo _doWorkAsyncMethod; + private readonly MethodInfo _doWorkMethod; + public QuartzPeriodicBackgroundWorkerAdapter() { AutoRegister = false; + + _doWorkAsyncMethod = typeof(TWorker).GetMethod("DoWorkAsync", BindingFlags.Instance | BindingFlags.NonPublic); + _doWorkMethod = typeof(TWorker).GetMethod("DoWork", BindingFlags.Instance | BindingFlags.NonPublic); + } public void BuildWorker(IBackgroundWorker worker) @@ -59,24 +66,18 @@ namespace Volo.Abp.BackgroundWorkers.Quartz { case AsyncPeriodicBackgroundWorkerBase asyncWorker: { - var doWorkAsyncMethod = asyncWorker.GetType() - .GetMethod("DoWorkAsync", BindingFlags.Instance | BindingFlags.NonPublic); - - if (doWorkAsyncMethod != null) + if (_doWorkAsyncMethod != null) { - await (Task) doWorkAsyncMethod.Invoke(asyncWorker, new object[] {workerContext}); + await (Task) _doWorkAsyncMethod.Invoke(asyncWorker, new object[] {workerContext}); } break; } case PeriodicBackgroundWorkerBase syncWorker: { - var doWorkMethod = syncWorker.GetType() - .GetMethod("DoWork", BindingFlags.Instance | BindingFlags.NonPublic); - - if (doWorkMethod != null) + if (_doWorkMethod != null) { - doWorkMethod.Invoke(syncWorker, new object[] {workerContext}); + _doWorkMethod.Invoke(syncWorker, new object[] {workerContext}); } break; From 2ac5e880a6483c8075b2639e1398f4da3e529579 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 27 Jun 2020 13:26:13 +0300 Subject: [PATCH 099/190] #4471 Remove Provider suffixes and Default prefixes for blob naming normalization --- .../AzureBlobContainerConfigurationExtensions.cs | 2 +- ...zerProvider.cs => AzureBlobNamingNormalizer.cs} | 2 +- ...leSystemBlobContainerConfigurationExtensions.cs | 2 +- ...ovider.cs => FileSystemBlobNamingNormalizer.cs} | 4 ++-- .../Volo/Abp/BlobStoring/BlobContainer.cs | 8 ++++---- .../Abp/BlobStoring/BlobContainerConfiguration.cs | 4 ++-- ...malizerProvider.cs => IBlobNamingNormalizer.cs} | 2 +- ...faultAzureBlobNamingNormalizerProvider_Tests.cs | 14 +++++++------- ...FileSystemBlobNamingNormalizerProvider_Tests.cs | 12 ++++++------ 9 files changed, 25 insertions(+), 25 deletions(-) rename framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/{DefaultAzureBlobNamingNormalizerProvider.cs => AzureBlobNamingNormalizer.cs} (94%) rename framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/{DefaultFileSystemBlobNamingNormalizerProvider.cs => FileSystemBlobNamingNormalizer.cs} (83%) rename framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/{IBlobNamingNormalizerProvider.cs => IBlobNamingNormalizer.cs} (76%) diff --git a/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobContainerConfigurationExtensions.cs b/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobContainerConfigurationExtensions.cs index 8b912dfb73..4f1c587530 100644 --- a/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobContainerConfigurationExtensions.cs +++ b/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobContainerConfigurationExtensions.cs @@ -15,7 +15,7 @@ namespace Volo.Abp.BlobStoring.Azure Action azureConfigureAction) { containerConfiguration.ProviderType = typeof(AzureBlobProvider); - containerConfiguration.NamingNormalizerProviders.Add(); + containerConfiguration.NamingNormalizers.Add(); azureConfigureAction(new AzureBlobProviderConfiguration(containerConfiguration)); diff --git a/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/DefaultAzureBlobNamingNormalizerProvider.cs b/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobNamingNormalizer.cs similarity index 94% rename from framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/DefaultAzureBlobNamingNormalizerProvider.cs rename to framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobNamingNormalizer.cs index d787553134..43b479e08e 100644 --- a/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/DefaultAzureBlobNamingNormalizerProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobNamingNormalizer.cs @@ -3,7 +3,7 @@ using Volo.Abp.DependencyInjection; namespace Volo.Abp.BlobStoring.Azure { - public class DefaultAzureBlobNamingNormalizerProvider : IBlobNamingNormalizerProvider, ITransientDependency + public class AzureBlobNamingNormalizer : IBlobNamingNormalizer, ITransientDependency { /// ///https://docs.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata#container-names diff --git a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobContainerConfigurationExtensions.cs b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobContainerConfigurationExtensions.cs index 92c03580a6..659b5cd2bc 100644 --- a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobContainerConfigurationExtensions.cs +++ b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobContainerConfigurationExtensions.cs @@ -15,7 +15,7 @@ namespace Volo.Abp.BlobStoring.FileSystem Action fileSystemConfigureAction) { containerConfiguration.ProviderType = typeof(FileSystemBlobProvider); - containerConfiguration.NamingNormalizerProviders.Add(); + containerConfiguration.NamingNormalizers.Add(); fileSystemConfigureAction(new FileSystemBlobProviderConfiguration(containerConfiguration)); diff --git a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/DefaultFileSystemBlobNamingNormalizerProvider.cs b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobNamingNormalizer.cs similarity index 83% rename from framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/DefaultFileSystemBlobNamingNormalizerProvider.cs rename to framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobNamingNormalizer.cs index bf42e3589a..f7d273dca7 100644 --- a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/DefaultFileSystemBlobNamingNormalizerProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobNamingNormalizer.cs @@ -6,11 +6,11 @@ using Volo.Abp.DependencyInjection; namespace Volo.Abp.BlobStoring.FileSystem { - public class DefaultFileSystemBlobNamingNormalizerProvider : IBlobNamingNormalizerProvider, ITransientDependency + public class FileSystemBlobNamingNormalizer : IBlobNamingNormalizer, ITransientDependency { private readonly IOSPlatformProvider _iosPlatformProvider; - public DefaultFileSystemBlobNamingNormalizerProvider(IOSPlatformProvider iosPlatformProvider) + public FileSystemBlobNamingNormalizer(IOSPlatformProvider iosPlatformProvider) { _iosPlatformProvider = iosPlatformProvider; } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs index 576e287cb0..a665e89e7f 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Linq; using System.Threading; @@ -106,17 +106,17 @@ namespace Volo.Abp.BlobStoring private (string, string) NormalizeContainerNameAndBlobName(string containerName, string blobName) { - if (!Configuration.NamingNormalizerProviders.Any()) + if (!Configuration.NamingNormalizers.Any()) { return (containerName, blobName); } using (var scope = ServiceProvider.CreateScope()) { - foreach (var provider in Configuration.NamingNormalizerProviders) + foreach (var provider in Configuration.NamingNormalizers) { var blobNamingNormalizerProvider = scope.ServiceProvider.GetRequiredService(provider) - .As(); + .As(); containerName = blobNamingNormalizerProvider.NormalizeContainerName(containerName); blobName = blobNamingNormalizerProvider.NormalizeBlobName(blobName); diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs index f5c6a7e50d..7ca94b4b42 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerConfiguration.cs @@ -24,7 +24,7 @@ namespace Volo.Abp.BlobStoring /// public bool IsMultiTenant { get; set; } = true; - public ITypeList NamingNormalizerProviders { get; } + public ITypeList NamingNormalizers { get; } [NotNull] private readonly Dictionary _properties; @@ -32,7 +32,7 @@ namespace Volo.Abp.BlobStoring public BlobContainerConfiguration(BlobContainerConfiguration fallbackConfiguration = null) { - NamingNormalizerProviders = new TypeList(); + NamingNormalizers = new TypeList(); _fallbackConfiguration = fallbackConfiguration; _properties = new Dictionary(); } diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNamingNormalizerProvider.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNamingNormalizer.cs similarity index 76% rename from framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNamingNormalizerProvider.cs rename to framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNamingNormalizer.cs index 8c5bff81c4..2bdc03507d 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNamingNormalizerProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/IBlobNamingNormalizer.cs @@ -1,6 +1,6 @@ namespace Volo.Abp.BlobStoring { - public interface IBlobNamingNormalizerProvider + public interface IBlobNamingNormalizer { string NormalizeContainerName(string containerName); diff --git a/framework/test/Volo.Abp.BlobStoring.Azure.Tests/Volo/Abp/BlobStoring/Azure/DefaultAzureBlobNamingNormalizerProvider_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Azure.Tests/Volo/Abp/BlobStoring/Azure/DefaultAzureBlobNamingNormalizerProvider_Tests.cs index 50e7e0b7ab..23df740630 100644 --- a/framework/test/Volo.Abp.BlobStoring.Azure.Tests/Volo/Abp/BlobStoring/Azure/DefaultAzureBlobNamingNormalizerProvider_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Azure.Tests/Volo/Abp/BlobStoring/Azure/DefaultAzureBlobNamingNormalizerProvider_Tests.cs @@ -5,18 +5,18 @@ namespace Volo.Abp.BlobStoring.Azure { public class DefaultAzureBlobNamingNormalizerProvider_Tests : AbpBlobStoringAzureTestCommonBase { - private readonly IBlobNamingNormalizerProvider _blobNamingNormalizerProvider; + private readonly IBlobNamingNormalizer _blobNamingNormalizer; public DefaultAzureBlobNamingNormalizerProvider_Tests() { - _blobNamingNormalizerProvider = GetRequiredService(); + _blobNamingNormalizer = GetRequiredService(); } [Fact] public void NormalizeContainerName_Lowercase() { var filename = "ThisIsMyContainerName"; - filename = _blobNamingNormalizerProvider.NormalizeContainerName(filename); + filename = _blobNamingNormalizer.NormalizeContainerName(filename); filename.ShouldBe("thisismycontainername"); } @@ -24,7 +24,7 @@ namespace Volo.Abp.BlobStoring.Azure public void NormalizeContainerName_Only_Letters_Numbers_Dash() { var filename = ",./this-i,./s-my-c,./ont,./ai+*/.=!@#$n^&*er-name.+/"; - filename = _blobNamingNormalizerProvider.NormalizeContainerName(filename); + filename = _blobNamingNormalizer.NormalizeContainerName(filename); filename.ShouldBe("this-is-my-container-name"); } @@ -32,7 +32,7 @@ namespace Volo.Abp.BlobStoring.Azure public void NormalizeContainerName_Dash() { var filename = "-this--is----my-container----name-"; - filename = _blobNamingNormalizerProvider.NormalizeContainerName(filename); + filename = _blobNamingNormalizer.NormalizeContainerName(filename); filename.ShouldBe("this-is-my-container-name"); } @@ -41,7 +41,7 @@ namespace Volo.Abp.BlobStoring.Azure public void NormalizeContainerName_Min_Length() { var filename = "a"; - filename = _blobNamingNormalizerProvider.NormalizeContainerName(filename); + filename = _blobNamingNormalizer.NormalizeContainerName(filename); filename.Length.ShouldBeGreaterThanOrEqualTo(3); } @@ -50,7 +50,7 @@ namespace Volo.Abp.BlobStoring.Azure public void NormalizeContainerName_Max_Length() { var filename = "abpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabp"; - filename = _blobNamingNormalizerProvider.NormalizeContainerName(filename); + filename = _blobNamingNormalizer.NormalizeContainerName(filename); filename.Length.ShouldBeLessThanOrEqualTo(63); } } diff --git a/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/DefaultFileSystemBlobNamingNormalizerProvider_Tests.cs b/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/DefaultFileSystemBlobNamingNormalizerProvider_Tests.cs index 7b4282996c..b3f9fcf5d1 100644 --- a/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/DefaultFileSystemBlobNamingNormalizerProvider_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo/Abp/BlobStoring/FileSystem/DefaultFileSystemBlobNamingNormalizerProvider_Tests.cs @@ -9,11 +9,11 @@ namespace Volo.Abp.BlobStoring.FileSystem { public class DefaultFileSystemBlobNamingNormalizerProvider_Tests : AbpBlobStoringFileSystemTestBase { - private readonly IBlobNamingNormalizerProvider _blobNamingNormalizerProvider; + private readonly IBlobNamingNormalizer _blobNamingNormalizer; public DefaultFileSystemBlobNamingNormalizerProvider_Tests() { - _blobNamingNormalizerProvider = GetRequiredService(); + _blobNamingNormalizer = GetRequiredService(); } protected override void AfterAddApplication(IServiceCollection services) @@ -27,7 +27,7 @@ namespace Volo.Abp.BlobStoring.FileSystem public void NormalizeContainerName() { var filename = "thisismy:*?\"<>|foldername"; - filename = _blobNamingNormalizerProvider.NormalizeContainerName(filename); + filename = _blobNamingNormalizer.NormalizeContainerName(filename); filename.ShouldBe("thisismyfoldername"); } @@ -35,7 +35,7 @@ namespace Volo.Abp.BlobStoring.FileSystem public void NormalizeBlobName() { var filename = "thisismy:*?\"<>|filename"; - filename = _blobNamingNormalizerProvider.NormalizeContainerName(filename); + filename = _blobNamingNormalizer.NormalizeContainerName(filename); filename.ShouldBe("thisismyfilename"); } @@ -45,7 +45,7 @@ namespace Volo.Abp.BlobStoring.FileSystem public void NormalizeContainerName_With_Directory(string delimiter) { var filename = $"thisis{delimiter}my:*?\"<>|{delimiter}foldername"; - filename = _blobNamingNormalizerProvider.NormalizeContainerName(filename); + filename = _blobNamingNormalizer.NormalizeContainerName(filename); filename.ShouldBe($"thisis{delimiter}my{delimiter}foldername"); } @@ -55,7 +55,7 @@ namespace Volo.Abp.BlobStoring.FileSystem public void NormalizeBlobName_With_Directory(string delimiter) { var filename = $"thisis{delimiter}my:*?\"<>|{delimiter}filename"; - filename = _blobNamingNormalizerProvider.NormalizeContainerName(filename); + filename = _blobNamingNormalizer.NormalizeContainerName(filename); filename.ShouldBe($"thisis{delimiter}my{delimiter}filename"); } } From f52472438e1334990d13a4c509fe901b7dc935b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 27 Jun 2020 13:29:09 +0300 Subject: [PATCH 100/190] #4471 Prevent duplicate adding the same normalizer to the same container. Also made TryAdd returns bool (we don't need it but someone may need) --- .../Azure/AzureBlobContainerConfigurationExtensions.cs | 2 +- .../FileSystemBlobContainerConfigurationExtensions.cs | 2 +- .../src/Volo.Abp.Core/Volo/Abp/Collections/ITypeList.cs | 2 +- framework/src/Volo.Abp.Core/Volo/Abp/Collections/TypeList.cs | 5 +++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobContainerConfigurationExtensions.cs b/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobContainerConfigurationExtensions.cs index 4f1c587530..3b3cbc4743 100644 --- a/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobContainerConfigurationExtensions.cs +++ b/framework/src/Volo.Abp.BlobStoring.Azure/Volo/Abp/BlobStoring/Azure/AzureBlobContainerConfigurationExtensions.cs @@ -15,7 +15,7 @@ namespace Volo.Abp.BlobStoring.Azure Action azureConfigureAction) { containerConfiguration.ProviderType = typeof(AzureBlobProvider); - containerConfiguration.NamingNormalizers.Add(); + containerConfiguration.NamingNormalizers.TryAdd(); azureConfigureAction(new AzureBlobProviderConfiguration(containerConfiguration)); diff --git a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobContainerConfigurationExtensions.cs b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobContainerConfigurationExtensions.cs index 659b5cd2bc..2bb818da56 100644 --- a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobContainerConfigurationExtensions.cs +++ b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobContainerConfigurationExtensions.cs @@ -15,7 +15,7 @@ namespace Volo.Abp.BlobStoring.FileSystem Action fileSystemConfigureAction) { containerConfiguration.ProviderType = typeof(FileSystemBlobProvider); - containerConfiguration.NamingNormalizers.Add(); + containerConfiguration.NamingNormalizers.TryAdd(); fileSystemConfigureAction(new FileSystemBlobProviderConfiguration(containerConfiguration)); diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Collections/ITypeList.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Collections/ITypeList.cs index 6d53ddc954..8906859edf 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Collections/ITypeList.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Collections/ITypeList.cs @@ -27,7 +27,7 @@ namespace Volo.Abp.Collections /// Adds a type to list if it's not already in the list. /// /// Type - void TryAdd() where T : TBaseType; + bool TryAdd() where T : TBaseType; /// /// Checks if a type exists in the list. diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Collections/TypeList.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Collections/TypeList.cs index 24e66085f7..1f4b7ddc40 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Collections/TypeList.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Collections/TypeList.cs @@ -60,14 +60,15 @@ namespace Volo.Abp.Collections _typeList.Add(typeof(T)); } - public void TryAdd() where T : TBaseType + public bool TryAdd() where T : TBaseType { if (Contains()) { - return; + return false; } Add(); + return true; } /// From 41943399b3c456837a27f312c6bc7cb35fb78418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 27 Jun 2020 14:00:19 +0300 Subject: [PATCH 101/190] #4471 Move private method to after public methods --- .../Volo/Abp/BlobStoring/BlobContainer.cs | 53 +++++++++---------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs index a665e89e7f..b4b43b7141 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs @@ -104,28 +104,6 @@ namespace Volo.Abp.BlobStoring ServiceProvider = serviceProvider; } - private (string, string) NormalizeContainerNameAndBlobName(string containerName, string blobName) - { - if (!Configuration.NamingNormalizers.Any()) - { - return (containerName, blobName); - } - - using (var scope = ServiceProvider.CreateScope()) - { - foreach (var provider in Configuration.NamingNormalizers) - { - var blobNamingNormalizerProvider = scope.ServiceProvider.GetRequiredService(provider) - .As(); - - containerName = blobNamingNormalizerProvider.NormalizeContainerName(containerName); - blobName = blobNamingNormalizerProvider.NormalizeBlobName(blobName); - } - - return (containerName, blobName); - } - } - public virtual async Task SaveAsync( string name, Stream stream, @@ -134,8 +112,7 @@ namespace Volo.Abp.BlobStoring { using (CurrentTenant.Change(GetTenantIdOrNull())) { - var (normalizedContainerName, normalizedBlobName) = - NormalizeContainerNameAndBlobName(ContainerName, name); + var (normalizedContainerName, normalizedBlobName) = NormalizeNaming(ContainerName, name); await Provider.SaveAsync( new BlobProviderSaveArgs( @@ -157,7 +134,7 @@ namespace Volo.Abp.BlobStoring using (CurrentTenant.Change(GetTenantIdOrNull())) { var (normalizedContainerName, normalizedBlobName) = - NormalizeContainerNameAndBlobName(ContainerName, name); + NormalizeNaming(ContainerName, name); return await Provider.DeleteAsync( new BlobProviderDeleteArgs( @@ -177,7 +154,7 @@ namespace Volo.Abp.BlobStoring using (CurrentTenant.Change(GetTenantIdOrNull())) { var (normalizedContainerName, normalizedBlobName) = - NormalizeContainerNameAndBlobName(ContainerName, name); + NormalizeNaming(ContainerName, name); return await Provider.ExistsAsync( new BlobProviderExistsArgs( @@ -213,7 +190,7 @@ namespace Volo.Abp.BlobStoring using (CurrentTenant.Change(GetTenantIdOrNull())) { var (normalizedContainerName, normalizedBlobName) = - NormalizeContainerNameAndBlobName(ContainerName, name); + NormalizeNaming(ContainerName, name); return await Provider.GetOrNullAsync( new BlobProviderGetArgs( @@ -235,5 +212,27 @@ namespace Volo.Abp.BlobStoring return CurrentTenant.Id; } + + protected virtual (string, string) NormalizeNaming(string containerName, string blobName) + { + if (!Configuration.NamingNormalizers.Any()) + { + return (containerName, blobName); + } + + using (var scope = ServiceProvider.CreateScope()) + { + foreach (var provider in Configuration.NamingNormalizers) + { + var blobNamingNormalizerProvider = scope.ServiceProvider.GetRequiredService(provider) + .As(); + + containerName = blobNamingNormalizerProvider.NormalizeContainerName(containerName); + blobName = blobNamingNormalizerProvider.NormalizeBlobName(blobName); + } + + return (containerName, blobName); + } + } } } From 5f6522267137a41c151d0ba733a5ea982968978f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 27 Jun 2020 14:00:52 +0300 Subject: [PATCH 102/190] #4471 Don't throw exception on IOSPlatformProvider.GetCurrentOSPlatform() --- .../System/Runtime/OSPlatformProvider.cs | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/framework/src/Volo.Abp.Core/System/Runtime/OSPlatformProvider.cs b/framework/src/Volo.Abp.Core/System/Runtime/OSPlatformProvider.cs index d2b05aac60..89b57acaab 100644 --- a/framework/src/Volo.Abp.Core/System/Runtime/OSPlatformProvider.cs +++ b/framework/src/Volo.Abp.Core/System/Runtime/OSPlatformProvider.cs @@ -5,17 +5,11 @@ namespace System.Runtime { public class OSPlatformProvider : IOSPlatformProvider, ITransientDependency { - public OSPlatform GetCurrentOSPlatform() + public virtual OSPlatform GetCurrentOSPlatform() { if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { - //MAC - return OSPlatform.OSX; - } - - if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - { - return OSPlatform.Linux; + return OSPlatform.OSX; //MAC } if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) @@ -23,7 +17,7 @@ namespace System.Runtime return OSPlatform.Windows; } - throw new Exception("Cannot determine operating system!"); + return OSPlatform.Linux; } } } From cdae51ba1aebcf2749375ea0e5d27727613b9051 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 27 Jun 2020 14:17:21 +0300 Subject: [PATCH 103/190] Refactor BlobContainer --- .../Volo/Abp/BlobStoring/BlobContainer.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs index b4b43b7141..cd2287e964 100644 --- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs +++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainer.cs @@ -222,13 +222,14 @@ namespace Volo.Abp.BlobStoring using (var scope = ServiceProvider.CreateScope()) { - foreach (var provider in Configuration.NamingNormalizers) + foreach (var normalizerType in Configuration.NamingNormalizers) { - var blobNamingNormalizerProvider = scope.ServiceProvider.GetRequiredService(provider) + var normalizer = scope.ServiceProvider + .GetRequiredService(normalizerType) .As(); - containerName = blobNamingNormalizerProvider.NormalizeContainerName(containerName); - blobName = blobNamingNormalizerProvider.NormalizeBlobName(blobName); + containerName = normalizer.NormalizeContainerName(containerName); + blobName = normalizer.NormalizeBlobName(blobName); } return (containerName, blobName); From 926fc0a5b07433e2c75f5785dc412c25b5a4ba45 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 27 Jun 2020 14:26:15 +0300 Subject: [PATCH 104/190] refactor: routes service sorting logic --- .../packages/core/src/lib/services/routes.service.ts | 7 ++++++- .../config/src/providers/route.provider.ts | 2 +- .../theme-shared/src/lib/services/nav-items.service.ts | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/services/routes.service.ts b/npm/ng-packs/packages/core/src/lib/services/routes.service.ts index 2324f09c0b..4a3426dd51 100644 --- a/npm/ng-packs/packages/core/src/lib/services/routes.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/routes.service.ts @@ -132,7 +132,12 @@ export abstract class AbstractNavTreeService extends Abstract readonly id = 'name'; readonly parentId = 'parentName'; readonly hide = (item: T) => item.invisible || !this.isGranted(item); - readonly sort = (a: T, b: T) => a.order - b.order; + readonly sort = (a: T, b: T) => { + if (!a.order) return 1; + if (!b.order) return -1; + + return a.order - b.order; + }; constructor(protected actions: Actions, protected store: Store) { super(); diff --git a/npm/ng-packs/packages/setting-management/config/src/providers/route.provider.ts b/npm/ng-packs/packages/setting-management/config/src/providers/route.provider.ts index badc46ae9a..b0f63eefe7 100644 --- a/npm/ng-packs/packages/setting-management/config/src/providers/route.provider.ts +++ b/npm/ng-packs/packages/setting-management/config/src/providers/route.provider.ts @@ -24,7 +24,7 @@ export function configureRoutes(routes: RoutesService) { parentName: eThemeSharedRouteNames.Administration, requiredPolicy: eSettingManagementPolicyNames.Settings, layout: eLayoutType.application, - order: 6, + order: 100, iconClass: 'fa fa-cog', }, ]); diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/nav-items.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/nav-items.service.ts index 95403837fd..874fc4b6e3 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/nav-items.service.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/nav-items.service.ts @@ -45,5 +45,5 @@ function sortItems(a: NavItem, b: NavItem) { if (!a.order) return 1; if (!b.order) return -1; - return a.order < b.order ? -1 : 1; + return a.order - b.order; } From 4d26765a5d57736509e536366978c07d4546006b Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 27 Jun 2020 15:02:21 +0300 Subject: [PATCH 105/190] chore: fix npm preview registry --- npm/ng-packs/scripts/publish.ts | 4 +++- npm/preview-publish.ps1 | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/scripts/publish.ts b/npm/ng-packs/scripts/publish.ts index f32afce7f7..80b791cabc 100644 --- a/npm/ng-packs/scripts/publish.ts +++ b/npm/ng-packs/scripts/publish.ts @@ -19,7 +19,9 @@ const publish = async () => { process.exit(1); } - const registry = program.preview ? 'http://localhost:4873' : 'https://registry.npmjs.org'; + const registry = program.preview + ? 'https://www.myget.org/F/abp-nightly/npm' + : 'https://registry.npmjs.org'; try { await execa('yarn', ['install'], { stdout: 'inherit', cwd: '../' }); diff --git a/npm/preview-publish.ps1 b/npm/preview-publish.ps1 index b1e5d8abe1..ea4afd44d6 100644 --- a/npm/preview-publish.ps1 +++ b/npm/preview-publish.ps1 @@ -16,7 +16,7 @@ $Version = $NextVersion; } if(-Not $Registry) { -$Registry = "http://localhost:4873"; +$Registry = "https://www.myget.org/F/abp-nightly/npm"; } $commands = ( From 28f4fb006feb45a906ced53873799d9217d9d374 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 27 Jun 2020 15:37:49 +0300 Subject: [PATCH 106/190] Remove Volo.Abp.UI package dependency from the Volo.Abp.TenantManagement.Domain package. --- .../Volo.Abp.TenantManagement.Domain.csproj | 1 - .../Abp/TenantManagement/AbpTenantManagementDomainModule.cs | 2 -- .../Volo/Abp/TenantManagement/TenantManager.cs | 1 - 3 files changed, 4 deletions(-) diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo.Abp.TenantManagement.Domain.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo.Abp.TenantManagement.Domain.csproj index 28541197c4..dc168af444 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo.Abp.TenantManagement.Domain.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo.Abp.TenantManagement.Domain.csproj @@ -21,7 +21,6 @@ - diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainModule.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainModule.cs index 5bf2aeb0b9..1f512c8807 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainModule.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainModule.cs @@ -5,7 +5,6 @@ using Volo.Abp.Domain; using Volo.Abp.Domain.Entities.Events.Distributed; using Volo.Abp.Modularity; using Volo.Abp.MultiTenancy; -using Volo.Abp.UI; namespace Volo.Abp.TenantManagement { @@ -14,7 +13,6 @@ namespace Volo.Abp.TenantManagement [DependsOn(typeof(AbpDataModule))] [DependsOn(typeof(AbpDddDomainModule))] [DependsOn(typeof(AbpAutoMapperModule))] - [DependsOn(typeof(AbpUiModule))] //TODO: It's not good to depend on the UI module. However, UserFriendlyException is inside it! public class AbpTenantManagementDomainModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/TenantManager.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/TenantManager.cs index d52734a667..a03c96142f 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/TenantManager.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/TenantManager.cs @@ -1,7 +1,6 @@ using System; using System.Threading.Tasks; using Volo.Abp.Domain.Services; -using Volo.Abp.UI; namespace Volo.Abp.TenantManagement { From 1eca93f9856d4292b46b3536bcbca635186d40a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 27 Jun 2020 15:38:24 +0300 Subject: [PATCH 107/190] Fix routes for feature and permission controllers. --- .../FeatureManagementRemoteServiceConsts.cs | 2 +- .../Volo/Abp/FeatureManagement/FeatureAppService.cs | 1 - .../Volo/Abp/FeatureManagement/FeaturesController.cs | 5 ++++- .../Volo/Abp/PermissionManagement/PermissionsController.cs | 5 ++++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureManagementRemoteServiceConsts.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureManagementRemoteServiceConsts.cs index 749805da05..c941a1b7eb 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureManagementRemoteServiceConsts.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureManagementRemoteServiceConsts.cs @@ -2,6 +2,6 @@ { public class FeatureManagementRemoteServiceConsts { - public const string RemoteServiceName = "FeatureManagement"; + public const string RemoteServiceName = "AbpFeatureManagement"; } } \ No newline at end of file diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs index 24b04b7013..6c9db9bade 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs @@ -16,7 +16,6 @@ namespace Volo.Abp.FeatureManagement public class FeatureAppService : FeatureManagementAppServiceBase, IFeatureAppService { protected FeatureManagementOptions Options { get; } - protected IFeatureManager FeatureManager { get; } protected IFeatureDefinitionManager FeatureDefinitionManager { get; } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo/Abp/FeatureManagement/FeaturesController.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo/Abp/FeatureManagement/FeaturesController.cs index e3eda46033..0ae78ed03f 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo/Abp/FeatureManagement/FeaturesController.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo/Abp/FeatureManagement/FeaturesController.cs @@ -5,7 +5,8 @@ using Volo.Abp.AspNetCore.Mvc; namespace Volo.Abp.FeatureManagement { [RemoteService(Name = FeatureManagementRemoteServiceConsts.RemoteServiceName)] - [Area("abp")] + [Area("featureManagement")] + [Route("api/feature-management/features")] public class FeaturesController : AbpController, IFeatureAppService { protected IFeatureAppService FeatureAppService { get; } @@ -15,11 +16,13 @@ namespace Volo.Abp.FeatureManagement FeatureAppService = featureAppService; } + [HttpGet] public virtual Task GetAsync(string providerName, string providerKey) { return FeatureAppService.GetAsync(providerName, providerKey); } + [HttpPut] public virtual Task UpdateAsync(string providerName, string providerKey, UpdateFeaturesDto input) { return FeatureAppService.UpdateAsync(providerName, providerKey, input); diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi/Volo/Abp/PermissionManagement/PermissionsController.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi/Volo/Abp/PermissionManagement/PermissionsController.cs index 2ed9a4d044..bb9db51f98 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi/Volo/Abp/PermissionManagement/PermissionsController.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.HttpApi/Volo/Abp/PermissionManagement/PermissionsController.cs @@ -5,7 +5,8 @@ using Volo.Abp.AspNetCore.Mvc; namespace Volo.Abp.PermissionManagement { [RemoteService(Name = PermissionManagementRemoteServiceConsts.RemoteServiceName)] - [Area("abp")] + [Area("permissionManagement")] + [Route("api/permission-management/permissions")] public class PermissionsController : AbpController, IPermissionAppService { protected IPermissionAppService PermissionAppService { get; } @@ -15,11 +16,13 @@ namespace Volo.Abp.PermissionManagement PermissionAppService = permissionAppService; } + [HttpGet] public virtual Task GetAsync(string providerName, string providerKey) { return PermissionAppService.GetAsync(providerName, providerKey); } + [HttpPut] public virtual Task UpdateAsync(string providerName, string providerKey, UpdatePermissionsDto input) { return PermissionAppService.UpdateAsync(providerName, providerKey, input); From 8a08e5f549b334316e590bbd9789d107f92b854f Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 27 Jun 2020 16:13:55 +0300 Subject: [PATCH 108/190] chore: remove parentName route from module-template --- .../my-project-name/config/src/providers/route.provider.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/templates/module/angular/projects/my-project-name/config/src/providers/route.provider.ts b/templates/module/angular/projects/my-project-name/config/src/providers/route.provider.ts index cedb6ac16d..38bfcf101e 100644 --- a/templates/module/angular/projects/my-project-name/config/src/providers/route.provider.ts +++ b/templates/module/angular/projects/my-project-name/config/src/providers/route.provider.ts @@ -18,7 +18,6 @@ export function configureRoutes(routes: RoutesService) { { path: '/my-project-name', name: eMyProjectNameRouteNames.MyProjectName, - parentName: eThemeSharedRouteNames.Administration, iconClass: 'fas fa-book', layout: eLayoutType.application, order: 3, From 88a32fd4a49b4204c608cafffbf419156148935a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 27 Jun 2020 22:17:05 +0300 Subject: [PATCH 109/190] Update Unit-Of-Work.md --- docs/en/Unit-Of-Work.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Unit-Of-Work.md b/docs/en/Unit-Of-Work.md index 907e601d30..743aa515bb 100644 --- a/docs/en/Unit-Of-Work.md +++ b/docs/en/Unit-Of-Work.md @@ -325,7 +325,7 @@ public async Task CreateAsync(string name) If your intent is just to save the changes after creating/updating/deleting an entity, it is suggested to use the `autoSave` option instead of manually using the `CurrentUnitOfWork.SaveChangesAsync()`. -> **Note-1**: All changes are automatically saved when a unit of work ends without any error. So, don't call `SaveChangesAsync()` unless you really need it. +> **Note-1**: All changes are automatically saved when a unit of work ends without any error. So, don't call `SaveChangesAsync()` and don't set `autoSave` to `true` unless you really need it. > > **Note-2**: If you use `Guid` as the primary key, you never need to save changes on insert to just get the generated id, because `Guid` keys are set in the application and are immediately available once you create a new entity. From e1e108a290a9c8efd68ee1f88b57b8c83e15d5da Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sun, 28 Jun 2020 11:29:13 +0300 Subject: [PATCH 110/190] fix: remove setting required policy --- .../packages/setting-management/config/src/enums/index.ts | 1 - .../setting-management/config/src/enums/policy-names.ts | 3 --- .../setting-management/config/src/providers/route.provider.ts | 2 -- 3 files changed, 6 deletions(-) delete mode 100644 npm/ng-packs/packages/setting-management/config/src/enums/policy-names.ts diff --git a/npm/ng-packs/packages/setting-management/config/src/enums/index.ts b/npm/ng-packs/packages/setting-management/config/src/enums/index.ts index 4a7a6a0e23..3bda94b078 100644 --- a/npm/ng-packs/packages/setting-management/config/src/enums/index.ts +++ b/npm/ng-packs/packages/setting-management/config/src/enums/index.ts @@ -1,2 +1 @@ -export * from './policy-names'; export * from './route-names'; diff --git a/npm/ng-packs/packages/setting-management/config/src/enums/policy-names.ts b/npm/ng-packs/packages/setting-management/config/src/enums/policy-names.ts deleted file mode 100644 index df66e95e3b..0000000000 --- a/npm/ng-packs/packages/setting-management/config/src/enums/policy-names.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const enum eSettingManagementPolicyNames { - Settings = 'AbpAccount.SettingManagement', -} diff --git a/npm/ng-packs/packages/setting-management/config/src/providers/route.provider.ts b/npm/ng-packs/packages/setting-management/config/src/providers/route.provider.ts index b0f63eefe7..28c0fb7388 100644 --- a/npm/ng-packs/packages/setting-management/config/src/providers/route.provider.ts +++ b/npm/ng-packs/packages/setting-management/config/src/providers/route.provider.ts @@ -2,7 +2,6 @@ import { eLayoutType, RoutesService, SettingTabsService } from '@abp/ng.core'; import { eThemeSharedRouteNames } from '@abp/ng.theme.shared'; import { APP_INITIALIZER } from '@angular/core'; import { debounceTime, map } from 'rxjs/operators'; -import { eSettingManagementPolicyNames } from '../enums/policy-names'; import { eSettingManagementRouteNames } from '../enums/route-names'; export const SETTING_MANAGEMENT_ROUTE_PROVIDERS = [ @@ -22,7 +21,6 @@ export function configureRoutes(routes: RoutesService) { name: eSettingManagementRouteNames.Settings, path: '/setting-management', parentName: eThemeSharedRouteNames.Administration, - requiredPolicy: eSettingManagementPolicyNames.Settings, layout: eLayoutType.application, order: 100, iconClass: 'fa fa-cog', From 5e9de84403cc1d2e29af49020c0c30c501d8d75f Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sun, 28 Jun 2020 13:12:28 +0300 Subject: [PATCH 111/190] chore: update README.mds --- templates/module/angular/README.md | 2 +- templates/module/angular/projects/my-project-name/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/module/angular/README.md b/templates/module/angular/README.md index 5f5ca53a7d..e284214f34 100644 --- a/templates/module/angular/README.md +++ b/templates/module/angular/README.md @@ -1,6 +1,6 @@ # MyProjectName -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.1.9. +This is a startup project based on the ABP framework. For more information, visit abp.io ## Development server diff --git a/templates/module/angular/projects/my-project-name/README.md b/templates/module/angular/projects/my-project-name/README.md index 182a550944..5181227a50 100644 --- a/templates/module/angular/projects/my-project-name/README.md +++ b/templates/module/angular/projects/my-project-name/README.md @@ -1,6 +1,6 @@ # MyProjectName -This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.1.11. +This is a startup project based on the ABP framework. For more information, visit abp.io Date: Sun, 28 Jun 2020 13:12:59 +0300 Subject: [PATCH 112/190] chore: change feature-management api url --- .../src/lib/services/feature-management.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/feature-management/src/lib/services/feature-management.service.ts b/npm/ng-packs/packages/feature-management/src/lib/services/feature-management.service.ts index 1020e60d4e..4aabf7bf80 100644 --- a/npm/ng-packs/packages/feature-management/src/lib/services/feature-management.service.ts +++ b/npm/ng-packs/packages/feature-management/src/lib/services/feature-management.service.ts @@ -15,7 +15,7 @@ export class FeatureManagementService { getFeatures(params: FeatureManagement.Provider): Observable { const request: Rest.Request = { method: 'GET', - url: '/api/abp/features', + url: '/api/feature-management/features', params, }; return this.rest.request(request, { @@ -30,7 +30,7 @@ export class FeatureManagementService { }: FeatureManagement.Provider & FeatureManagement.Features): Observable { const request: Rest.Request = { method: 'PUT', - url: '/api/abp/features', + url: '/api/feature-management/features', body: { features }, params: { providerKey, providerName }, }; From f908600519af59de0d1cbc9c2ff95261bd2b34c5 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sun, 28 Jun 2020 13:14:00 +0300 Subject: [PATCH 113/190] chore: change permission-management api url --- .../src/lib/services/permission-management.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/permission-management/src/lib/services/permission-management.service.ts b/npm/ng-packs/packages/permission-management/src/lib/services/permission-management.service.ts index fa6433e952..4825036f81 100644 --- a/npm/ng-packs/packages/permission-management/src/lib/services/permission-management.service.ts +++ b/npm/ng-packs/packages/permission-management/src/lib/services/permission-management.service.ts @@ -16,7 +16,7 @@ export class PermissionManagementService { ): Observable { const request: Rest.Request = { method: 'GET', - url: '/api/abp/permissions', + url: '/api/permission-management/permissions', params, }; @@ -33,7 +33,7 @@ export class PermissionManagementService { }: PermissionManagement.GrantedProvider & PermissionManagement.UpdateRequest): Observable { const request: Rest.Request = { method: 'PUT', - url: '/api/abp/permissions', + url: '/api/permission-management/permissions', body: { permissions }, params: { providerKey, providerName }, }; From 03141405d4caecbb75343a9542441e7ce9ff04e3 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sun, 28 Jun 2020 13:15:40 +0300 Subject: [PATCH 114/190] feat: add route provider to app template resolves #4418 --- .../app/angular/src/app/app-routing.module.ts | 54 ++++++++++--------- templates/app/angular/src/app/app.module.ts | 6 +-- .../src/app/home/home-routing.module.ts | 8 +-- .../app/angular/src/app/route.provider.ts | 20 +++++++ 4 files changed, 51 insertions(+), 37 deletions(-) create mode 100644 templates/app/angular/src/app/route.provider.ts diff --git a/templates/app/angular/src/app/app-routing.module.ts b/templates/app/angular/src/app/app-routing.module.ts index 4a6658a089..793703a3ad 100644 --- a/templates/app/angular/src/app/app-routing.module.ts +++ b/templates/app/angular/src/app/app-routing.module.ts @@ -1,35 +1,37 @@ -import { ABP } from '@abp/ng.core'; +import { ABP, DynamicLayoutComponent } from '@abp/ng.core'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; const routes: Routes = [ { path: '', - loadChildren: () => import('./home/home.module').then((m) => m.HomeModule), - data: { - routes: { - name: '::Menu:Home', - } as ABP.Route, - }, - }, - { - path: 'account', - loadChildren: () => - import('@abp/ng.account').then((m) => m.AccountModule.forLazy({ redirectUrl: '/' })), - }, - { - path: 'identity', - loadChildren: () => import('@abp/ng.identity').then((m) => m.IdentityModule.forLazy()), - }, - { - path: 'tenant-management', - loadChildren: () => - import('@abp/ng.tenant-management').then((m) => m.TenantManagementModule.forLazy()), - }, - { - path: 'setting-management', - loadChildren: () => - import('@abp/ng.setting-management').then((m) => m.SettingManagementModule.forLazy()), + component: DynamicLayoutComponent, + children: [ + { + path: '', + pathMatch: 'full', + loadChildren: () => import('./home/home.module').then((m) => m.HomeModule), + }, + { + path: 'account', + loadChildren: () => + import('@abp/ng.account').then((m) => m.AccountModule.forLazy({ redirectUrl: '/' })), + }, + { + path: 'identity', + loadChildren: () => import('@abp/ng.identity').then((m) => m.IdentityModule.forLazy()), + }, + { + path: 'tenant-management', + loadChildren: () => + import('@abp/ng.tenant-management').then((m) => m.TenantManagementModule.forLazy()), + }, + { + path: 'setting-management', + loadChildren: () => + import('@abp/ng.setting-management').then((m) => m.SettingManagementModule.forLazy()), + }, + ], }, ]; diff --git a/templates/app/angular/src/app/app.module.ts b/templates/app/angular/src/app/app.module.ts index 2ad5f8a7bc..3cfafc9098 100644 --- a/templates/app/angular/src/app/app.module.ts +++ b/templates/app/angular/src/app/app.module.ts @@ -8,13 +8,11 @@ import { ThemeSharedModule } from '@abp/ng.theme.shared'; import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { NgxsLoggerPluginModule } from '@ngxs/logger-plugin'; import { NgxsModule } from '@ngxs/store'; import { environment } from '../environments/environment'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; - -const LOGGERS = [NgxsLoggerPluginModule.forRoot({ disabled: false })]; +import { APP_ROUTE_PROVIDER } from './route.provider'; @NgModule({ imports: [ @@ -31,9 +29,9 @@ const LOGGERS = [NgxsLoggerPluginModule.forRoot({ disabled: false })]; SettingManagementConfigModule.forRoot(), NgxsModule.forRoot(), ThemeBasicModule.forRoot(), - ...(environment.production ? [] : LOGGERS), ], declarations: [AppComponent], + providers: [APP_ROUTE_PROVIDER], bootstrap: [AppComponent], }) export class AppModule {} diff --git a/templates/app/angular/src/app/home/home-routing.module.ts b/templates/app/angular/src/app/home/home-routing.module.ts index 367affb583..0cce36228e 100644 --- a/templates/app/angular/src/app/home/home-routing.module.ts +++ b/templates/app/angular/src/app/home/home-routing.module.ts @@ -3,13 +3,7 @@ import { Routes, RouterModule } from '@angular/router'; import { HomeComponent } from './home.component'; import { ApplicationLayoutComponent } from '@abp/ng.theme.basic'; -const routes: Routes = [ - { - path: '', - component: ApplicationLayoutComponent, - children: [{ path: '', component: HomeComponent }], - }, -]; +const routes: Routes = [{ path: '', component: HomeComponent }]; @NgModule({ imports: [RouterModule.forChild(routes)], diff --git a/templates/app/angular/src/app/route.provider.ts b/templates/app/angular/src/app/route.provider.ts new file mode 100644 index 0000000000..5a14ad7ba0 --- /dev/null +++ b/templates/app/angular/src/app/route.provider.ts @@ -0,0 +1,20 @@ +import { RoutesService, eLayoutType } from '@abp/ng.core'; +import { APP_INITIALIZER } from '@angular/core'; + +export const APP_ROUTE_PROVIDER = [ + { provide: APP_INITIALIZER, useFactory: configureRoutes, deps: [RoutesService], multi: true }, +]; + +function configureRoutes(routes: RoutesService) { + return () => { + routes.add([ + { + path: '/', + name: '::Menu:Home', + iconClass: 'fas fa-home', + order: 1, + layout: eLayoutType.application, + }, + ]); + }; +} From 1c91ff55f4cf098b372caa0c963e8a57d90b6354 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sun, 28 Jun 2020 13:18:27 +0300 Subject: [PATCH 115/190] feat: upgrade angular version of app template #4494 --- .../angular/{browserslist => .browserslistrc} | 0 templates/app/angular/e2e/tsconfig.json | 4 +- templates/app/angular/package.json | 47 +++++++------ templates/app/angular/tsconfig.app.json | 2 +- templates/app/angular/tsconfig.base.json | 22 +++++++ templates/app/angular/tsconfig.json | 37 +++++------ templates/app/angular/tsconfig.spec.json | 2 +- templates/app/angular/tslint.json | 66 ++++++++++++++++++- 8 files changed, 130 insertions(+), 50 deletions(-) rename templates/app/angular/{browserslist => .browserslistrc} (100%) create mode 100644 templates/app/angular/tsconfig.base.json diff --git a/templates/app/angular/browserslist b/templates/app/angular/.browserslistrc similarity index 100% rename from templates/app/angular/browserslist rename to templates/app/angular/.browserslistrc diff --git a/templates/app/angular/e2e/tsconfig.json b/templates/app/angular/e2e/tsconfig.json index 39b800f789..6b87cc425b 100644 --- a/templates/app/angular/e2e/tsconfig.json +++ b/templates/app/angular/e2e/tsconfig.json @@ -1,9 +1,9 @@ { - "extends": "../tsconfig.json", + "extends": "../tsconfig.base.json", "compilerOptions": { "outDir": "../out-tsc/e2e", "module": "commonjs", - "target": "es5", + "target": "es2018", "types": [ "jasmine", "jasminewd2", diff --git a/templates/app/angular/package.json b/templates/app/angular/package.json index efc61110a0..f6a8d6edb5 100644 --- a/templates/app/angular/package.json +++ b/templates/app/angular/package.json @@ -5,6 +5,7 @@ "ng": "ng", "start": "ng serve --open", "build": "ng build", + "build:prod": "ng build --prod", "test": "ng test", "lint": "ng lint", "e2e": "ng e2e" @@ -16,41 +17,39 @@ "@abp/ng.setting-management": "~2.9.0", "@abp/ng.tenant-management": "~2.9.0", "@abp/ng.theme.basic": "~2.9.0", - "@angular/animations": "~9.1.0", - "@angular/common": "~9.1.0", - "@angular/compiler": "~9.1.0", - "@angular/core": "~9.1.0", - "@angular/forms": "~9.1.0", - "@angular/platform-browser": "~9.1.0", - "@angular/platform-browser-dynamic": "~9.1.0", - "@angular/router": "~9.1.0", - "@swimlane/ngx-datatable": "^17.0.0", + "@angular/animations": "~10.0.1", + "@angular/common": "~10.0.1", + "@angular/compiler": "~10.0.1", + "@angular/core": "~10.0.1", + "@angular/forms": "~10.0.1", + "@angular/platform-browser": "~10.0.1", + "@angular/platform-browser-dynamic": "~10.0.1", + "@angular/router": "~10.0.1", "rxjs": "~6.5.4", - "tslib": "^1.10.0", + "tslib": "^2.0.0", "zone.js": "~0.10.2" }, "devDependencies": { - "@angular-devkit/build-angular": "~0.901.0", - "@angular-devkit/build-ng-packagr": "~0.901.0", - "@angular/cli": "~9.1.0", - "@angular/compiler-cli": "~9.1.0", - "@angular/language-service": "~9.1.0", - "@ngxs/logger-plugin": "^3.6.2", + "@angular-devkit/build-angular": "~0.1000.0", + "@angular-devkit/build-ng-packagr": "~0.1000.0", + "@angular/cli": "~10.0.0", + "@angular/compiler-cli": "~10.0.1", + "@angular/language-service": "~10.0.1", "@types/jasmine": "~3.5.0", "@types/jasminewd2": "~2.0.3", "@types/node": "^12.11.1", "codelyzer": "^5.1.2", "jasmine-core": "~3.5.0", - "jasmine-spec-reporter": "~4.2.1", - "karma": "~4.4.1", + "jasmine-spec-reporter": "~5.0.0", + "karma": "~5.0.0", "karma-chrome-launcher": "~3.1.0", - "karma-coverage-istanbul-reporter": "~2.1.0", - "karma-jasmine": "~3.0.1", - "karma-jasmine-html-reporter": "^1.4.2", - "ng-packagr": "^9.0.0", - "protractor": "~5.4.3", + "karma-coverage-istanbul-reporter": "~3.0.2", + "karma-jasmine": "~3.3.0", + "karma-jasmine-html-reporter": "^1.5.0", + "ng-packagr": "^10.0.0", + "protractor": "~7.0.0", "ts-node": "~8.3.0", "tslint": "~6.1.0", - "typescript": "~3.8.3" + "typescript": "~3.9.5" } } diff --git a/templates/app/angular/tsconfig.app.json b/templates/app/angular/tsconfig.app.json index 29f5f5864e..81e534ed7b 100644 --- a/templates/app/angular/tsconfig.app.json +++ b/templates/app/angular/tsconfig.app.json @@ -1,5 +1,5 @@ { - "extends": "./tsconfig.json", + "extends": "./tsconfig.base.json", "compilerOptions": { "outDir": "./out-tsc/app", "types": [] diff --git a/templates/app/angular/tsconfig.base.json b/templates/app/angular/tsconfig.base.json new file mode 100644 index 0000000000..2f67131c75 --- /dev/null +++ b/templates/app/angular/tsconfig.base.json @@ -0,0 +1,22 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "module": "esnext", + "moduleResolution": "node", + "importHelpers": true, + "target": "es2015", + "typeRoots": ["node_modules/@types"], + "lib": ["es2018", "dom"] + }, + "angularCompilerOptions": { + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true, + "enableIvy": true + } +} diff --git a/templates/app/angular/tsconfig.json b/templates/app/angular/tsconfig.json index 2f67131c75..7e00e70771 100644 --- a/templates/app/angular/tsconfig.json +++ b/templates/app/angular/tsconfig.json @@ -1,22 +1,17 @@ +/* + This is a "Solution Style" tsconfig.json file, and is used by editors and TypeScript’s language server to improve development experience. + It is not intended to be used to perform a compilation. + + To learn more about this file see: https://angular.io/config/solution-tsconfig. +*/ { - "compileOnSave": false, - "compilerOptions": { - "baseUrl": "./", - "outDir": "./dist/out-tsc", - "sourceMap": true, - "declaration": false, - "downlevelIteration": true, - "experimentalDecorators": true, - "module": "esnext", - "moduleResolution": "node", - "importHelpers": true, - "target": "es2015", - "typeRoots": ["node_modules/@types"], - "lib": ["es2018", "dom"] - }, - "angularCompilerOptions": { - "fullTemplateTypeCheck": true, - "strictInjectionParameters": true, - "enableIvy": true - } -} + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} \ No newline at end of file diff --git a/templates/app/angular/tsconfig.spec.json b/templates/app/angular/tsconfig.spec.json index 6400fde7d5..1db2e6ee9c 100644 --- a/templates/app/angular/tsconfig.spec.json +++ b/templates/app/angular/tsconfig.spec.json @@ -1,5 +1,5 @@ { - "extends": "./tsconfig.json", + "extends": "./tsconfig.base.json", "compilerOptions": { "outDir": "./out-tsc/spec", "types": [ diff --git a/templates/app/angular/tslint.json b/templates/app/angular/tslint.json index c8d70f1520..58a97b08a5 100644 --- a/templates/app/angular/tslint.json +++ b/templates/app/angular/tslint.json @@ -1,8 +1,16 @@ { "extends": "tslint:recommended", "rules": { + "align": { + "options": [ + "parameters", + "statements" + ] + }, "array-type": false, "arrow-parens": false, + "arrow-return-shorthand": true, + "curly": true, "deprecation": { "severity": "warning" }, @@ -21,10 +29,17 @@ "app", "kebab-case" ], + "eofline": true, "import-blacklist": [ true, "rxjs/Rx" ], + "import-spacing": true, + "indent": { + "options": [ + "spaces" + ] + }, "interface-name": false, "max-classes-per-file": false, "max-line-length": [ @@ -71,6 +86,20 @@ true, "single" ], + "semicolon": { + "options": [ + "always" + ] + }, + "space-before-function-paren": { + "options": { + "anonymous": "never", + "asyncArrow": "always", + "constructor": "never", + "method": "never", + "named": "never" + } + }, "trailing-comma": false, "no-conflicting-lifecycle": true, "no-host-metadata-property": true, @@ -82,9 +111,44 @@ "no-outputs-metadata-property": true, "template-banana-in-box": true, "template-no-negated-async": true, + "typedef-whitespace": { + "options": [ + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + }, + { + "call-signature": "onespace", + "index-signature": "onespace", + "parameter": "onespace", + "property-declaration": "onespace", + "variable-declaration": "onespace" + } + ] + }, "use-lifecycle-interface": true, "use-pipe-transform-interface": true - }, + , "variable-name": { + "options": [ + "ban-keywords", + "check-format", + "allow-pascal-case" + ] + }, + "whitespace": { + "options": [ + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type", + "check-typecast" + ] + } +}, "rulesDirectory": [ "codelyzer" ] From f76e510bf2780735684ffb7fcb9284785a12fbad Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sun, 28 Jun 2020 13:41:32 +0300 Subject: [PATCH 116/190] test: fix testing error --- .../core/src/lib/tests/routes.service.spec.ts | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts index 93214442ea..c1413d73ab 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts @@ -33,10 +33,10 @@ describe('Routes Service', () => { const visible = await service.visible$.pipe(take(1)).toPromise(); expect(flat.length).toBe(4); - expect(flat[0].name).toBe('foo'); - expect(flat[1].name).toBe('baz'); - expect(flat[2].name).toBe('x'); - expect(flat[3].name).toBe('bar'); + expect(flat[3].name).toBe('foo'); + expect(flat[0].name).toBe('baz'); + expect(flat[1].name).toBe('x'); + expect(flat[2].name).toBe('bar'); expect(tree.length).toBe(1); expect(tree[0].name).toBe('foo'); @@ -88,8 +88,8 @@ describe('Routes Service', () => { const visible = service.visible; expect(flat.length).toBe(2); - expect(flat[0].name).toBe('foo'); - expect(flat[1].name).toBe('x'); + expect(flat[1].name).toBe('foo'); + expect(flat[0].name).toBe('x'); expect(tree.length).toBe(1); expect(tree[0].name).toBe('foo'); @@ -114,10 +114,10 @@ describe('Routes Service', () => { const visible = service.visible; expect(flat.length).toBe(4); - expect(flat[0].name).toBe('foo'); - expect(flat[1].name).toBe('baz'); - expect(flat[2].name).toBe('x'); - expect(flat[3].name).toBe('bar'); + expect(flat[3].name).toBe('foo'); + expect(flat[0].name).toBe('baz'); + expect(flat[1].name).toBe('x'); + expect(flat[2].name).toBe('bar'); expect(tree.length).toBe(1); expect(tree[0].name).toBe('foo'); From 78c913044b2cf1073d3661de39c70615debd312f Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Sun, 28 Jun 2020 20:06:28 +0800 Subject: [PATCH 117/190] Change Volo.Docs.Admin.HttpApi.Client project target to netstandard2.0 --- .../Volo.Docs.Admin.HttpApi.Client.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/Volo.Docs.Admin.HttpApi.Client.csproj b/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/Volo.Docs.Admin.HttpApi.Client.csproj index 076bc1d37a..00b0e26d75 100644 --- a/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/Volo.Docs.Admin.HttpApi.Client.csproj +++ b/modules/docs/src/Volo.Docs.Admin.HttpApi.Client/Volo.Docs.Admin.HttpApi.Client.csproj @@ -4,7 +4,7 @@ - netcoreapp3.1 + netstandard2.0 Volo.Docs.Admin.HttpApi.Client Volo.Docs.Admin.HttpApi.Client From 53755089a7fe866be581bd3c15496f4cb3648c19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 28 Jun 2020 16:22:05 +0300 Subject: [PATCH 118/190] Added CommunityWebSite entry. --- .../AbpIoLocalization/Account/Localization/Resources/en.json | 3 ++- .../AbpIoLocalization/Account/Localization/Resources/tr.json | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/en.json index d4e51eeadf..eb49443d6e 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/en.json @@ -8,6 +8,7 @@ "FrameworkDocumentation": "Framework documentation", "OfficialBlog": "Official blog", "CommercialHomePage": "Commercial home page", - "CommercialSupportWebSite": "Commercial support web site" + "CommercialSupportWebSite": "Commercial support web site", + "CommunityWebSite": "ABP community web site" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/tr.json index 9c36cd611b..e403e72cf6 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/tr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/tr.json @@ -8,6 +8,7 @@ "FrameworkDocumentation": "Framework Dokümantasyon", "OfficialBlog": "Resmi blog", "CommercialHomePage": "Kurumsal ana sayfa", - "CommercialSupportWebSite": "Kurumsal destek web sitesi" + "CommercialSupportWebSite": "Kurumsal destek web sitesi", + "CommunityWebSite": "ABP topluluk web sitesi" } } \ No newline at end of file From 4f86aff010ed20b1c62a485dd71b15f1d54ea281 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Sun, 28 Jun 2020 21:26:04 +0800 Subject: [PATCH 119/190] Generate the correct editLink value --- .../Volo/Docs/GitHub/Documents/GithubDocumentSource.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentSource.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentSource.cs index ef6f6e1ebb..1da1ab1f9d 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentSource.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentSource.cs @@ -38,7 +38,7 @@ namespace Volo.Docs.GitHub.Documents var rawDocumentUrl = rawRootUrl + documentName; var isNavigationDocument = documentName == project.NavigationDocumentName; var isParameterDocument = documentName == project.ParametersDocumentName; - var editLink = rootUrl.ReplaceFirst("/tree/", "/blob/") + languageCode + "/" + documentName; + var editLink = rootUrl.ReplaceFirst("/tree/", "/blob/").EnsureEndsWith('/') + languageCode + "/" + documentName; var localDirectory = ""; var fileName = documentName; From 391e443a6d84c7d35cb78c1fb0df06b5a676ce50 Mon Sep 17 00:00:00 2001 From: Ismail Yilmaz Date: Sun, 28 Jun 2020 18:41:35 +0300 Subject: [PATCH 120/190] Disable property auditing for base auditing properties --- .../EntityHistory/EntityHistoryHelper.cs | 61 ++++++++++++++++++- ...thAuditedAndHasCustomAuditingProperties.cs | 26 ++++++++ .../AppFullAuditedEntityWithAudited.cs | 21 +++++++ .../AbpAuditingTestDbContext.cs | 4 ++ .../Volo/Abp/Auditing/Auditing_Tests.cs | 59 ++++++++++++++++++ 5 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/Entities/AppEntityWithAuditedAndHasCustomAuditingProperties.cs create mode 100644 framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/Entities/AppFullAuditedEntityWithAudited.cs diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EntityHistory/EntityHistoryHelper.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EntityHistory/EntityHistoryHelper.cs index 8db091eb30..796c6e20fb 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EntityHistory/EntityHistoryHelper.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EntityHistory/EntityHistoryHelper.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; @@ -241,6 +242,11 @@ namespace Volo.Abp.EntityFrameworkCore.EntityHistory } } + if (IsBaseAuditProperty(propertyInfo, entityType)) + { + return false; + } + var isModified = !(propertyEntry.OriginalValue?.Equals(propertyEntry.CurrentValue) ?? propertyEntry.CurrentValue == null); if (isModified) { @@ -250,6 +256,59 @@ namespace Volo.Abp.EntityFrameworkCore.EntityHistory return defaultValue; } + private bool IsBaseAuditProperty(PropertyInfo propertyInfo, Type entityType) + { + if (entityType.IsAssignableTo() + && propertyInfo.Name == nameof(IHasCreationTime.CreationTime)) + { + return true; + } + + if (entityType.IsAssignableTo() + && propertyInfo.Name == nameof(IMayHaveCreator.CreatorId)) + { + return true; + } + + if (entityType.IsAssignableTo() + && propertyInfo.Name == nameof(IMustHaveCreator.CreatorId)) + { + return true; + } + + if (entityType.IsAssignableTo() + && propertyInfo.Name == nameof(IHasModificationTime.LastModificationTime)) + { + return true; + } + + if (entityType.IsAssignableTo() + && propertyInfo.Name == nameof(IModificationAuditedObject.LastModifierId)) + { + return true; + } + + if (entityType.IsAssignableTo() + && propertyInfo.Name == nameof(ISoftDelete.IsDeleted)) + { + return true; + } + + if (entityType.IsAssignableTo() + && propertyInfo.Name == nameof(IHasDeletionTime.DeletionTime)) + { + return true; + } + + if (entityType.IsAssignableTo() + && propertyInfo.Name == nameof(IDeletionAuditedObject.DeleterId)) + { + return true; + } + + return false; + } + /// /// Updates change time, entity id and foreign keys after SaveChanges is called. /// @@ -313,4 +372,4 @@ namespace Volo.Abp.EntityFrameworkCore.EntityHistory } } } -} +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/Entities/AppEntityWithAuditedAndHasCustomAuditingProperties.cs b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/Entities/AppEntityWithAuditedAndHasCustomAuditingProperties.cs new file mode 100644 index 0000000000..9ff57b286d --- /dev/null +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/Entities/AppEntityWithAuditedAndHasCustomAuditingProperties.cs @@ -0,0 +1,26 @@ +using System; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.Auditing.App.Entities +{ + [Audited] + public class AppEntityWithAuditedAndHasCustomAuditingProperties : AggregateRoot + { + protected AppEntityWithAuditedAndHasCustomAuditingProperties() + { + } + + public AppEntityWithAuditedAndHasCustomAuditingProperties(Guid id) + : base(id) + { + } + + public DateTime? CreationTime { get; set; } + public Guid? CreatorId { get; set; } + public DateTime? LastModificationTime { get; set; } + public Guid? LastModifierId { get; set; } + public bool IsDeleted { get; set; } + public DateTime? DeletionTime { get; set; } + public Guid? DeleterId { get; set; } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/Entities/AppFullAuditedEntityWithAudited.cs b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/Entities/AppFullAuditedEntityWithAudited.cs new file mode 100644 index 0000000000..def7e0d44c --- /dev/null +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/Entities/AppFullAuditedEntityWithAudited.cs @@ -0,0 +1,21 @@ +using System; +using Volo.Abp.Domain.Entities.Auditing; + +namespace Volo.Abp.Auditing.App.Entities +{ + [Audited] + public class AppFullAuditedEntityWithAudited : FullAuditedAggregateRoot + { + protected AppFullAuditedEntityWithAudited() + { + } + + public AppFullAuditedEntityWithAudited(Guid id, string name) + : base(id) + { + Name = name; + } + + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/EntityFrameworkCore/AbpAuditingTestDbContext.cs b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/EntityFrameworkCore/AbpAuditingTestDbContext.cs index 0968bf2cc2..d6b2d2b167 100644 --- a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/EntityFrameworkCore/AbpAuditingTestDbContext.cs +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/App/EntityFrameworkCore/AbpAuditingTestDbContext.cs @@ -17,6 +17,10 @@ namespace Volo.Abp.Auditing.App.EntityFrameworkCore public DbSet AppEntityWithPropertyHasAudited { get; set; } public DbSet AppEntityWithSelector { get; set; } + + public DbSet AppFullAuditedEntityWithAudited { get; set; } + + public DbSet AppEntityWithAuditedAndHasCustomAuditingProperties { get; set; } public AbpAuditingTestDbContext(DbContextOptions options) : base(options) diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/Auditing_Tests.cs b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/Auditing_Tests.cs index 2887eb8510..8c647c92c4 100644 --- a/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/Auditing_Tests.cs +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/Auditing_Tests.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -215,5 +216,63 @@ namespace Volo.Abp.Auditing #pragma warning restore 4014 } + private static List GetBaseAuditPropertyNames() + { + return new List + { + nameof(IHasCreationTime.CreationTime), + nameof(IMustHaveCreator.CreatorId), + nameof(IHasModificationTime.LastModificationTime), + nameof(IModificationAuditedObject.LastModifierId), + nameof(ISoftDelete.IsDeleted), + nameof(IHasDeletionTime.DeletionTime), + nameof(IDeletionAuditedObject.DeleterId) + }; + } + + [Fact] + public virtual async Task Should_Write_AuditLog_Ignoring_Base_Auditing_Properties_For_Entity_That_Has_Audited_Attribute() + { + using (var scope = _auditingManager.BeginScope()) + { + var repository = ServiceProvider.GetRequiredService>(); + await repository.InsertAsync(new AppFullAuditedEntityWithAudited(Guid.NewGuid(), "test name")); + await scope.SaveAsync(); + } + +#pragma warning disable 4014 + _auditingStore.Received().SaveAsync(Arg.Is(x => x.EntityChanges.Count == 1 + && x.EntityChanges[0].PropertyChanges.Any(y => + !GetBaseAuditPropertyNames().Contains(y.PropertyName)))); +#pragma warning restore 4014 + } + + [Fact] + public virtual async Task Should_Write_AuditLog_Including_Custom_Base_Auditing_Properties_For_Entity_That_Has_Audited_Attribute() + { + using (var scope = _auditingManager.BeginScope()) + { + var repository = ServiceProvider.GetRequiredService>(); + await repository.InsertAsync(new AppEntityWithAuditedAndHasCustomAuditingProperties(Guid.NewGuid()) + { + CreationTime = DateTime.Now, + CreatorId = Guid.NewGuid(), + LastModificationTime = DateTime.Now, + LastModifierId = Guid.NewGuid(), + IsDeleted = true, + DeletionTime = DateTime.Now, + DeleterId = Guid.NewGuid() + }); + await scope.SaveAsync(); + } + +#pragma warning disable 4014 + _auditingStore.Received().SaveAsync(Arg.Is(x => x.EntityChanges.Count == 1 + && x.EntityChanges[0].PropertyChanges + .Where(y => y.PropertyName != nameof(AppEntityWithAuditedAndHasCustomAuditingProperties + .ExtraProperties)) + .All(y => GetBaseAuditPropertyNames().Contains(y.PropertyName)))); +#pragma warning restore 4014 + } } } From f2e95c2f477008dbd2505f6ac5d0425338abbe8c Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Mon, 29 Jun 2020 10:41:57 +0800 Subject: [PATCH 121/190] Add roles to CurrentUserDto. https://github.com/abpframework/abp/issues/4517 --- .../AspNetCore/Mvc/ApplicationConfigurations/CurrentUserDto.cs | 2 ++ .../AbpApplicationConfigurationAppService.cs | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/CurrentUserDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/CurrentUserDto.cs index 2197d7b08e..ce08bebe87 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/CurrentUserDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/CurrentUserDto.cs @@ -14,5 +14,7 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations public string UserName { get; set; } public string Email { get; set; } + + public string[] Roles { get; set; } } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs index 5aa8f07059..54815d6ff5 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs @@ -117,7 +117,8 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations Id = _currentUser.Id, TenantId = _currentUser.TenantId, UserName = _currentUser.UserName, - Email = _currentUser.Email + Email = _currentUser.Email, + Roles = _currentUser.Roles }; } From d13c58ecee1ad79f225e3135e418fdaab626e472 Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Mon, 29 Jun 2020 14:24:27 +0800 Subject: [PATCH 122/190] Exclude primitive type in CreateType method. Resolve #4486 --- .../Abp/Cli/Commands/GenerateProxyCommand.cs | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GenerateProxyCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GenerateProxyCommand.cs index d148346836..b11e3a54f4 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GenerateProxyCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GenerateProxyCommand.cs @@ -55,7 +55,7 @@ namespace Volo.Abp.Cli.Commands var environment = JObject.Parse(environmentJson); apiUrl = environment["apis"]["default"]["url"].ToString(); } - apiUrl += "/api/abp/api-definition?IncludeTypes=true"; + apiUrl = apiUrl.EnsureEndsWith('/') + "api/abp/api-definition?IncludeTypes=true"; var uiFramework = GetUiFramework(commandLineArgs); @@ -469,17 +469,21 @@ namespace Volo.Abp.Cli.Commands if (returnValueType.Contains("<")) { returnValueType = returnValueType.Split('<')[1].Split('>')[0]; + var clrType = Type.GetType(returnValueType, throwOnError: false); + if (clrType != null && TypeHelper.IsPrimitiveExtended(clrType, includeEnums: true)) + { + return null; + } + if (returnValueType.StartsWith("Volo.Abp.Application.Dtos") - || returnValueType.StartsWith("System.Collections") - || returnValueType == "System.String" - || returnValueType == "System.Void" - || returnValueType.Contains("System.Net.HttpStatusCode?") - || returnValueType.Contains("IActionResult") - || returnValueType.Contains("ActionResult") - || returnValueType.Contains("IStringValueType") - || returnValueType.Contains("IValueValidator") - || returnValueType.Contains("Guid") - ) + || returnValueType.StartsWith("System.Collections") + || returnValueType == "System.Void" + || returnValueType.Contains("System.Net.HttpStatusCode?") + || returnValueType.Contains("IActionResult") + || returnValueType.Contains("ActionResult") + || returnValueType.Contains("IStringValueType") + || returnValueType.Contains("IValueValidator") + ) { return null; } From 0b76186928c2e28b4a0fe856f852cc4c8a187440 Mon Sep 17 00:00:00 2001 From: Necati Meral Date: Mon, 29 Jun 2020 09:09:52 +0200 Subject: [PATCH 123/190] Used different names for `ReadOnlyRepository` and `Repository` in application services Still using `protected new` on `CrudAppService` because the repository member in `AbstractKeyCrudAppService` has to be renamed to something like `AbstractKeyRepository`, which would be a breaking change. Renaming the repository in each descendant could lead to misunderstandings, since in `CrudAppService` descendants will be three repositories to choose from: `Repository`, `ReadOnlyRepository`, `AbstractKeyRepository`. Currently the user must only differ between `ReadOnlyRepository` and `Repository`. @maliming, can you review this? --- .../Abp/Application/Services/AbstractKeyCrudAppService.cs | 2 +- .../Application/Services/AbstractKeyReadOnlyAppService.cs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs index ce44a22455..11550c456f 100644 --- a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs @@ -62,7 +62,7 @@ namespace Volo.Abp.Application.Services ICrudAppService where TEntity : class, IEntity { - protected new IRepository Repository { get; } + protected IRepository Repository { get; } protected virtual string CreatePolicyName { get; set; } diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyReadOnlyAppService.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyReadOnlyAppService.cs index 45dff23852..9085434211 100644 --- a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyReadOnlyAppService.cs +++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyReadOnlyAppService.cs @@ -36,7 +36,7 @@ namespace Volo.Abp.Application.Services , IReadOnlyAppService where TEntity : class, IEntity { - protected IReadOnlyRepository Repository { get; } + protected IReadOnlyRepository ReadOnlyRepository { get; } protected virtual string GetPolicyName { get; set; } @@ -44,7 +44,7 @@ namespace Volo.Abp.Application.Services protected AbstractKeyReadOnlyAppService(IReadOnlyRepository repository) { - Repository = repository; + ReadOnlyRepository = repository; } public virtual async Task GetAsync(TKey id) @@ -123,7 +123,7 @@ namespace Volo.Abp.Application.Services return query.OrderByDescending(e => ((ICreationAuditedObject)e).CreationTime); } - throw new AbpException("No sorting specified but this query requires sorting. Override the ApplyDefaultSorting method for your application service derived from AbstractKeyCrudAppService!"); + throw new AbpException("No sorting specified but this query requires sorting. Override the ApplyDefaultSorting method for your application service derived from AbstractKeyReadOnlyAppService!"); } /// @@ -158,7 +158,7 @@ namespace Volo.Abp.Application.Services /// The input. protected virtual IQueryable CreateFilteredQuery(TGetListInput input) { - return Repository; + return ReadOnlyRepository; } /// From 3f5fe7d79576c6ea554dfae325b8b3f29b4bad3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ak=C4=B1n=20Sabri=20=C3=87am?= Date: Mon, 29 Jun 2020 10:14:52 +0300 Subject: [PATCH 124/190] added localization keys for organizations page in abp io admin --- .../Admin/Localization/Resources/en.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index 9e5afc3b33..9bd9521862 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -102,7 +102,16 @@ "DoYouWantToCreateNewUser": "Do you want to create new user?", "MasterModules": "Master Modules", "OrganizationName": "Organization name", + "CreationDate": "Creation date", + "LicenseStart": "License start date", + "LicenseEndDate": "License end date", "OrganizationNamePlaceholder": "Organization name...", + "TotalQuestionCountPlaceholder": "Total question count...", + "RemainingQuestionCountPlaceholder": "Remaining question count...", + "LicenseTypePlaceholder": "License type...", + "CreationDatePlaceholder": "Creation date...", + "LicenseStartDatePlaceholder": "License start date...", + "LicenseEndDatePlaceholder": "License end date...", "UsernameOrEmail": "Username or email", "UsernameOrEmailPlaceholder": "Username or email...", "Member": "Member", From 97884d4479fd28b3826c8150771f9356040f6c57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ak=C4=B1n=20Sabri=20=C3=87am?= Date: Mon, 29 Jun 2020 10:51:36 +0300 Subject: [PATCH 125/190] updated "^" chars to "~" char in npm packages --- npm/packs/anchor-js/package.json | 4 +- .../package.json | 2 +- .../package.json | 28 +- npm/packs/aspnetcore.mvc.ui/package.json | 12 +- npm/packs/blogging/package.json | 8 +- npm/packs/bootstrap-datepicker/package.json | 2 +- npm/packs/bootstrap/package.json | 4 +- npm/packs/chart.js/package.json | 2 +- npm/packs/clipboard/package.json | 4 +- npm/packs/codemirror/package.json | 4 +- npm/packs/core/package.json | 2 +- npm/packs/datatables.net-bs4/package.json | 4 +- npm/packs/datatables.net/package.json | 4 +- npm/packs/docs/package.json | 10 +- npm/packs/flag-icon-css/package.json | 2 +- npm/packs/font-awesome/package.json | 4 +- npm/packs/highlight.js/package.json | 2 +- npm/packs/jquery-form/package.json | 4 +- .../package.json | 4 +- npm/packs/jquery-validation/package.json | 4 +- npm/packs/jquery/package.json | 4 +- npm/packs/jstree/package.json | 4 +- npm/packs/lodash/package.json | 4 +- npm/packs/luxon/package.json | 2 +- .../package.json | 4 +- npm/packs/markdown-it/package.json | 4 +- npm/packs/owl.carousel/package.json | 4 +- npm/packs/popper.js/package.json | 4 +- npm/packs/prismjs/package.json | 6 +- npm/packs/select2/package.json | 4 +- npm/packs/signalr/package.json | 4 +- npm/packs/sweetalert/package.json | 4 +- npm/packs/timeago/package.json | 4 +- npm/packs/toastr/package.json | 4 +- npm/packs/tui-editor/package.json | 10 +- npm/packs/uppy/package.json | 4 +- npm/packs/utils/package.json | 32 +- npm/packs/utils/yarn.lock | 1135 ++++++++++------- npm/packs/virtual-file-explorer/package.json | 4 +- 39 files changed, 782 insertions(+), 569 deletions(-) diff --git a/npm/packs/anchor-js/package.json b/npm/packs/anchor-js/package.json index a2f03be34c..f15601f8eb 100644 --- a/npm/packs/anchor-js/package.json +++ b/npm/packs/anchor-js/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/core": "^2.9.0", - "anchor-js": "^4.2.2" + "@abp/core": "~2.9.0", + "anchor-js": "~4.2.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json b/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json index f79a22eb42..332e4575fb 100644 --- a/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json +++ b/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json @@ -5,7 +5,7 @@ "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "^2.9.0" + "@abp/aspnetcore.mvc.ui.theme.shared": "~2.9.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json b/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json index 67faa1cbad..098ee37f5e 100644 --- a/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json +++ b/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json @@ -5,20 +5,20 @@ "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui": "^2.9.0", - "@abp/bootstrap": "^2.9.0", - "@abp/bootstrap-datepicker": "^2.9.0", - "@abp/datatables.net-bs4": "^2.9.0", - "@abp/font-awesome": "^2.9.0", - "@abp/jquery-form": "^2.9.0", - "@abp/jquery-validation-unobtrusive": "^2.9.0", - "@abp/lodash": "^2.9.0", - "@abp/luxon": "^2.9.0", - "@abp/malihu-custom-scrollbar-plugin": "^2.9.0", - "@abp/select2": "^2.9.0", - "@abp/sweetalert": "^2.9.0", - "@abp/timeago": "^2.9.0", - "@abp/toastr": "^2.9.0" + "@abp/aspnetcore.mvc.ui": "~2.9.0", + "@abp/bootstrap": "~2.9.0", + "@abp/bootstrap-datepicker": "~2.9.0", + "@abp/datatables.net-bs4": "~2.9.0", + "@abp/font-awesome": "~2.9.0", + "@abp/jquery-form": "~2.9.0", + "@abp/jquery-validation-unobtrusive": "~2.9.0", + "@abp/lodash": "~2.9.0", + "@abp/luxon": "~2.9.0", + "@abp/malihu-custom-scrollbar-plugin": "~2.9.0", + "@abp/select2": "~2.9.0", + "@abp/sweetalert": "~2.9.0", + "@abp/timeago": "~2.9.0", + "@abp/toastr": "~2.9.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.mvc.ui/package.json b/npm/packs/aspnetcore.mvc.ui/package.json index 6a83218d4e..fae31b200f 100644 --- a/npm/packs/aspnetcore.mvc.ui/package.json +++ b/npm/packs/aspnetcore.mvc.ui/package.json @@ -5,12 +5,12 @@ "access": "public" }, "dependencies": { - "ansi-colors": "^4.1.1", - "extend-object": "^1.0.0", - "gulp": "^4.0.2", - "merge-stream": "^2.0.0", - "path": "^0.12.7", - "rimraf": "^3.0.2" + "ansi-colors": "~4.1.1", + "extend-object": "~1.0.0", + "gulp": "~4.0.2", + "merge-stream": "~2.0.0", + "path": "~0.12.7", + "rimraf": "~3.0.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/blogging/package.json b/npm/packs/blogging/package.json index 667f5c109f..fcedcfd60d 100644 --- a/npm/packs/blogging/package.json +++ b/npm/packs/blogging/package.json @@ -5,10 +5,10 @@ "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "^2.9.0", - "@abp/owl.carousel": "^2.9.0", - "@abp/prismjs": "^2.9.0", - "@abp/tui-editor": "^2.9.0" + "@abp/aspnetcore.mvc.ui.theme.shared": "~2.9.0", + "@abp/owl.carousel": "~2.9.0", + "@abp/prismjs": "~2.9.0", + "@abp/tui-editor": "~2.9.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/bootstrap-datepicker/package.json b/npm/packs/bootstrap-datepicker/package.json index 95c506c542..c755a18199 100644 --- a/npm/packs/bootstrap-datepicker/package.json +++ b/npm/packs/bootstrap-datepicker/package.json @@ -5,7 +5,7 @@ "access": "public" }, "dependencies": { - "bootstrap-datepicker": "^1.9.0" + "bootstrap-datepicker": "~1.9.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/bootstrap/package.json b/npm/packs/bootstrap/package.json index ba4072f27d..d540d0bffb 100644 --- a/npm/packs/bootstrap/package.json +++ b/npm/packs/bootstrap/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/core": "^2.9.0", - "bootstrap": "^4.5.0", + "@abp/core": "~2.9.0", + "bootstrap": "~4.5.0", "bootstrap-v4-rtl": "4.4.1-2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/chart.js/package.json b/npm/packs/chart.js/package.json index 435d1cef93..d98bece90e 100644 --- a/npm/packs/chart.js/package.json +++ b/npm/packs/chart.js/package.json @@ -5,7 +5,7 @@ "access": "public" }, "dependencies": { - "chart.js": "^2.9.3" + "chart.js": "~2.9.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/clipboard/package.json b/npm/packs/clipboard/package.json index b8e93ae709..42ba81b4ac 100644 --- a/npm/packs/clipboard/package.json +++ b/npm/packs/clipboard/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/core": "^2.9.0", - "clipboard": "^2.0.6" + "@abp/core": "~2.9.0", + "clipboard": "~2.0.6" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/codemirror/package.json b/npm/packs/codemirror/package.json index 4cf988efba..80d6145831 100644 --- a/npm/packs/codemirror/package.json +++ b/npm/packs/codemirror/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/core": "^2.9.0", - "codemirror": "^5.54.0" + "@abp/core": "~2.9.0", + "codemirror": "~5.54.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/core/package.json b/npm/packs/core/package.json index 905c45502e..ae546f65bc 100644 --- a/npm/packs/core/package.json +++ b/npm/packs/core/package.json @@ -5,7 +5,7 @@ "access": "public" }, "dependencies": { - "@abp/utils": "^2.9.0" + "@abp/utils": "~2.9.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/datatables.net-bs4/package.json b/npm/packs/datatables.net-bs4/package.json index 088a54695f..5a6998c40d 100644 --- a/npm/packs/datatables.net-bs4/package.json +++ b/npm/packs/datatables.net-bs4/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/datatables.net": "^2.9.0", - "datatables.net-bs4": "^1.10.21" + "@abp/datatables.net": "~2.9.0", + "datatables.net-bs4": "~1.10.21" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/datatables.net/package.json b/npm/packs/datatables.net/package.json index 040be671d9..cc6221d5e2 100644 --- a/npm/packs/datatables.net/package.json +++ b/npm/packs/datatables.net/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "^2.9.0", - "datatables.net": "^1.10.21" + "@abp/jquery": "~2.9.0", + "datatables.net": "~1.10.21" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/docs/package.json b/npm/packs/docs/package.json index 8c46472300..03c3ca5737 100644 --- a/npm/packs/docs/package.json +++ b/npm/packs/docs/package.json @@ -5,11 +5,11 @@ "access": "public" }, "dependencies": { - "@abp/anchor-js": "^2.9.0", - "@abp/clipboard": "^2.9.0", - "@abp/malihu-custom-scrollbar-plugin": "^2.9.0", - "@abp/popper.js": "^2.9.0", - "@abp/prismjs": "^2.9.0" + "@abp/anchor-js": "~2.9.0", + "@abp/clipboard": "~2.9.0", + "@abp/malihu-custom-scrollbar-plugin": "~2.9.0", + "@abp/popper.js": "~2.9.0", + "@abp/prismjs": "~2.9.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/flag-icon-css/package.json b/npm/packs/flag-icon-css/package.json index e66cc044fd..88471bcb8c 100644 --- a/npm/packs/flag-icon-css/package.json +++ b/npm/packs/flag-icon-css/package.json @@ -5,7 +5,7 @@ "access": "public" }, "dependencies": { - "flag-icon-css": "^3.5.0" + "flag-icon-css": "~3.5.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/font-awesome/package.json b/npm/packs/font-awesome/package.json index a9515093c5..5b9b7ec09f 100644 --- a/npm/packs/font-awesome/package.json +++ b/npm/packs/font-awesome/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/core": "^2.9.0", - "@fortawesome/fontawesome-free": "^5.13.0" + "@abp/core": "~2.9.0", + "@fortawesome/fontawesome-free": "~5.13.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/highlight.js/package.json b/npm/packs/highlight.js/package.json index c2bc4c2759..ca18ea2e23 100644 --- a/npm/packs/highlight.js/package.json +++ b/npm/packs/highlight.js/package.json @@ -5,7 +5,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "^2.9.0" + "@abp/core": "~2.9.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/jquery-form/package.json b/npm/packs/jquery-form/package.json index 273cab07de..6e14ed8b33 100644 --- a/npm/packs/jquery-form/package.json +++ b/npm/packs/jquery-form/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "^2.9.0", - "jquery-form": "^4.3.0" + "@abp/jquery": "~2.9.0", + "jquery-form": "~4.3.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/jquery-validation-unobtrusive/package.json b/npm/packs/jquery-validation-unobtrusive/package.json index 65cdd8781f..2f2238395e 100644 --- a/npm/packs/jquery-validation-unobtrusive/package.json +++ b/npm/packs/jquery-validation-unobtrusive/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/jquery-validation": "^2.9.0", - "jquery-validation-unobtrusive": "^3.2.11" + "@abp/jquery-validation": "~2.9.0", + "jquery-validation-unobtrusive": "~3.2.11" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/jquery-validation/package.json b/npm/packs/jquery-validation/package.json index eed1c90ab5..593289b918 100644 --- a/npm/packs/jquery-validation/package.json +++ b/npm/packs/jquery-validation/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "^2.9.0", - "jquery-validation": "^1.19.2" + "@abp/jquery": "~2.9.0", + "jquery-validation": "~1.19.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/jquery/package.json b/npm/packs/jquery/package.json index 6b1bfd73db..e1a1b9434e 100644 --- a/npm/packs/jquery/package.json +++ b/npm/packs/jquery/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/core": "^2.9.0", - "jquery": "^3.5.1" + "@abp/core": "~2.9.0", + "jquery": "~3.5.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/jstree/package.json b/npm/packs/jstree/package.json index 468a45baf5..fc72dbe215 100644 --- a/npm/packs/jstree/package.json +++ b/npm/packs/jstree/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "^2.9.0", - "jstree": "^3.3.9" + "@abp/jquery": "~2.9.0", + "jstree": "~3.3.9" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/lodash/package.json b/npm/packs/lodash/package.json index c4d299339c..2fb0d8d79e 100644 --- a/npm/packs/lodash/package.json +++ b/npm/packs/lodash/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/core": "^2.9.0", - "lodash": "^4.17.15" + "@abp/core": "~2.9.0", + "lodash": "~4.17.15" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/luxon/package.json b/npm/packs/luxon/package.json index 489fc20e48..1bdd991a4b 100644 --- a/npm/packs/luxon/package.json +++ b/npm/packs/luxon/package.json @@ -5,7 +5,7 @@ "access": "public" }, "dependencies": { - "luxon": "^1.24.1" + "luxon": "~1.24.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/malihu-custom-scrollbar-plugin/package.json b/npm/packs/malihu-custom-scrollbar-plugin/package.json index 2c735e32d2..c06b5cde77 100644 --- a/npm/packs/malihu-custom-scrollbar-plugin/package.json +++ b/npm/packs/malihu-custom-scrollbar-plugin/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/core": "^2.9.0", - "malihu-custom-scrollbar-plugin": "^3.1.5" + "@abp/core": "~2.9.0", + "malihu-custom-scrollbar-plugin": "~3.1.5" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/markdown-it/package.json b/npm/packs/markdown-it/package.json index 79b8832b13..801b51b173 100644 --- a/npm/packs/markdown-it/package.json +++ b/npm/packs/markdown-it/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/core": "^2.9.0", - "markdown-it": "^11.0.0" + "@abp/core": "~2.9.0", + "markdown-it": "~11.0.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/owl.carousel/package.json b/npm/packs/owl.carousel/package.json index 249bbfa19d..361e3f1706 100644 --- a/npm/packs/owl.carousel/package.json +++ b/npm/packs/owl.carousel/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/core": "^2.9.0", - "owl.carousel": "^2.3.4" + "@abp/core": "~2.9.0", + "owl.carousel": "~2.3.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/popper.js/package.json b/npm/packs/popper.js/package.json index 827654861f..f7219d380f 100644 --- a/npm/packs/popper.js/package.json +++ b/npm/packs/popper.js/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/core": "^2.9.0", - "popper.js": "^1.16.0" + "@abp/core": "~2.9.0", + "popper.js": "~1.16.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/prismjs/package.json b/npm/packs/prismjs/package.json index 8afd71da08..8e42cfe26b 100644 --- a/npm/packs/prismjs/package.json +++ b/npm/packs/prismjs/package.json @@ -5,9 +5,9 @@ "access": "public" }, "dependencies": { - "@abp/clipboard": "^2.9.0", - "@abp/core": "^2.9.0", - "prismjs": "^1.20.0" + "@abp/clipboard": "~2.9.0", + "@abp/core": "~2.9.0", + "prismjs": "~1.20.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/select2/package.json b/npm/packs/select2/package.json index e57ff9223b..5e24bb3e2e 100644 --- a/npm/packs/select2/package.json +++ b/npm/packs/select2/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/core": "^2.9.0", - "select2": "^4.0.13" + "@abp/core": "~2.9.0", + "select2": "~4.0.13" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/signalr/package.json b/npm/packs/signalr/package.json index 782bca4e4f..7ae0c08c88 100644 --- a/npm/packs/signalr/package.json +++ b/npm/packs/signalr/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/core": "^2.9.0", - "@microsoft/signalr": "^3.1.5" + "@abp/core": "~2.9.0", + "@microsoft/signalr": "~3.1.5" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/sweetalert/package.json b/npm/packs/sweetalert/package.json index 718a532787..2cc7eb215a 100644 --- a/npm/packs/sweetalert/package.json +++ b/npm/packs/sweetalert/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/core": "^2.9.0", - "sweetalert": "^2.1.2" + "@abp/core": "~2.9.0", + "sweetalert": "~2.1.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/timeago/package.json b/npm/packs/timeago/package.json index 6fb50e3673..e28a5111cc 100644 --- a/npm/packs/timeago/package.json +++ b/npm/packs/timeago/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "^2.9.0", - "timeago": "^1.6.7" + "@abp/jquery": "~2.9.0", + "timeago": "~1.6.7" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/toastr/package.json b/npm/packs/toastr/package.json index bc733604bb..81c6f22c05 100644 --- a/npm/packs/toastr/package.json +++ b/npm/packs/toastr/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "^2.9.0", - "toastr": "^2.1.4" + "@abp/jquery": "~2.9.0", + "toastr": "~2.1.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/tui-editor/package.json b/npm/packs/tui-editor/package.json index 5f9b5889da..2293636854 100644 --- a/npm/packs/tui-editor/package.json +++ b/npm/packs/tui-editor/package.json @@ -5,11 +5,11 @@ "access": "public" }, "dependencies": { - "@abp/codemirror": "^2.9.0", - "@abp/highlight.js": "^2.9.0", - "@abp/jquery": "^2.9.0", - "@abp/markdown-it": "^2.9.0", - "tui-editor": "^1.4.10" + "@abp/codemirror": "~2.9.0", + "@abp/highlight.js": "~2.9.0", + "@abp/jquery": "~2.9.0", + "@abp/markdown-it": "~2.9.0", + "tui-editor": "~1.4.10" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/uppy/package.json b/npm/packs/uppy/package.json index 93b3c4fce7..7ab59402b1 100644 --- a/npm/packs/uppy/package.json +++ b/npm/packs/uppy/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/core": "^2.9.0", - "uppy": "^1.16.1" + "@abp/core": "~2.9.0", + "uppy": "~1.16.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/utils/package.json b/npm/packs/utils/package.json index 820d06e625..306f36e74f 100644 --- a/npm/packs/utils/package.json +++ b/npm/packs/utils/package.json @@ -23,35 +23,35 @@ "metadata": "dist/abp-utils.metadata.json", "sideEffects": false, "devDependencies": { - "@angular-builders/jest": "^9.0.0", + "@angular-builders/jest": "~9.0.0", "@angular-devkit/build-ng-packagr": "~0.1000.0", "@angular/cli": "~10.0.0", - "@angular/common": "^10.0.0", + "@angular/common": "~10.0.0", "@angular/compiler": "~10.0.0", "@angular/compiler-cli": "~10.0.0", "@angular/core": "~10.0.0", - "@angular/platform-browser": "^10.0.0", - "@angular/platform-browser-dynamic": "^10.0.0", - "@types/execa": "^2.0.0", - "@types/fs-extra": "^8.1.0", - "@types/jest": "^25.1.4", - "@types/node": "^12.11.1", - "codelyzer": "^5.1.2", - "execa": "^4.0.0", - "fs-extra": "^9.0.0", - "jest": "^25.2.4", - "jest-preset-angular": "^8.1.2", - "ng-packagr": "^10.0.0", + "@angular/platform-browser": "~10.0.0", + "@angular/platform-browser-dynamic": "~10.0.0", + "@types/execa": "~2.0.0", + "@types/fs-extra": "~8.1.0", + "@types/jest": "~25.1.4", + "@types/node": "~12.11.1", + "codelyzer": "~5.1.2", + "execa": "~4.0.0", + "fs-extra": "~9.0.0", + "jest": "~25.2.4", + "jest-preset-angular": "~8.1.2", + "ng-packagr": "~10.0.0", "protractor": "~7.0.0", "ts-node": "~8.3.0", - "tslib": "^2.0.0", + "tslib": "~2.0.0", "tslint": "~6.1.0", "typescript": "~3.9.5", "zone.js": "~0.10.2" }, "peerDependencies": {}, "dependencies": { - "just-compare": "^1.3.0" + "just-compare": "~1.3.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/utils/yarn.lock b/npm/packs/utils/yarn.lock index c0118807c1..2326123327 100644 --- a/npm/packs/utils/yarn.lock +++ b/npm/packs/utils/yarn.lock @@ -2,14 +2,14 @@ # yarn lockfile v1 -"@angular-builders/jest@^9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@angular-builders/jest/-/jest-9.0.0.tgz#84c88d3e177823cd5c47e3c3ed7f550d40c64bf5" - integrity sha512-7kEoX6qXHwI5b/DpPvAZzJs29vSm20Pe7IBJAsGU6Csns69FtqS+IxB0J2oxIhKMjbnclXvSYnIb6QLvjUKUEQ== +"@angular-builders/jest@~9.0.0": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@angular-builders/jest/-/jest-9.0.1.tgz#e2fcdce8f9ad3060eb8a19bdb17dc47075b8eec5" + integrity sha512-dHbAKxPbRMNZ9a3t2jeuyOKRA7HxYNlDf54xU6CIDnJP6w/PqefKUCLfjkHCbPKtau1ttu6pc+cXYzpp833G3w== dependencies: - "@angular-devkit/architect" "^0.900.0" + "@angular-devkit/architect" ">=0.900.0 < 0.1000.0" "@angular-devkit/core" "^9.0.0" - jest-preset-angular "^8.0.0" + jest-preset-angular "^8.1.2" lodash "^4.17.10" "@angular-devkit/architect@0.1000.0": @@ -20,13 +20,13 @@ "@angular-devkit/core" "10.0.0" rxjs "6.5.5" -"@angular-devkit/architect@^0.900.0": - version "0.900.7" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.900.7.tgz#11884bc3c3be8618a62c8e80d61c3410ab954719" - integrity sha512-hfiTVYc72kzbXrzK4tea6jnTDnSKpE1D+vEptBXN2tdXEVNEAQI5Qm5L1zVDtt16UdqoUTUypIgUc9jcNH1mUQ== +"@angular-devkit/architect@>=0.900.0 < 0.1000.0": + version "0.901.9" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.901.9.tgz#5d849a120449b2f91ec6eef44ddad74ffb7ad810" + integrity sha512-Xokyh7bv4qICHpb5Xui1jPTi6ZZvzR5tbTIxT0DFWqw16TEkFgkNubQsW6mFSR3g3CXdySMfOwWExfa/rE1ggA== dependencies: - "@angular-devkit/core" "9.0.7" - rxjs "6.5.3" + "@angular-devkit/core" "9.1.9" + rxjs "6.5.4" "@angular-devkit/build-ng-packagr@~0.1000.0": version "0.1000.0" @@ -47,15 +47,15 @@ rxjs "6.5.5" source-map "0.7.3" -"@angular-devkit/core@9.0.7": - version "9.0.7" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-9.0.7.tgz#97e452ad88d36391d621748487c5bab655edfe84" - integrity sha512-tMrz36sM1xrwvFf9Qm59GwALscVlMP7rQBjtd0fIR/QbsiOAIX4AQbV+vN6Vtwnzo5NIRZY1IXJUhesWms+h5w== +"@angular-devkit/core@9.1.9": + version "9.1.9" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-9.1.9.tgz#e6283912093179313ccfc69856841e9b6b318231" + integrity sha512-SWgBh4an/Vezjw2BZ5S+bKvuK5lH6gOtR8d5YjN9vxpJSZ0GimrGjfnLlWOkwWAsU8jfn4JzofECUHwX/7EW6Q== dependencies: - ajv "6.10.2" - fast-json-stable-stringify "2.0.0" - magic-string "0.25.4" - rxjs "6.5.3" + ajv "6.12.0" + fast-json-stable-stringify "2.1.0" + magic-string "0.25.7" + rxjs "6.5.4" source-map "0.7.3" "@angular-devkit/core@^9.0.0": @@ -104,10 +104,10 @@ universal-analytics "0.4.20" uuid "8.1.0" -"@angular/common@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-10.0.0.tgz#a819dacbf3b9a3629f7e0d43a504cdd3b5fad58d" - integrity sha512-zaLHMRQqjZyoIc15tLGrwg5ugcVlggqATiMlMVNo9ddqxwpZ4qHK2fdAvqQy9FfWKaPGi6NpIBSR31RGV0ircw== +"@angular/common@~10.0.0": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-10.0.1.tgz#f306fd8a9858fc5243fbec0508e6281419ec8ca9" + integrity sha512-vxySLwnXFvtLRoXRkNaSpcJ8UiusiaJm1RxZyInihLUMO9rOuVSSYVC/zDOGnPY2lLn7ThiRibo9lz4Cb7PHTw== dependencies: tslib "^2.0.0" @@ -144,17 +144,17 @@ dependencies: tslib "^2.0.0" -"@angular/platform-browser-dynamic@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.0.0.tgz#edf99f3276fa4f13a2a533f742053286fb005354" - integrity sha512-Ol9dMU/UB8PZ1xQkcILmANC+tA1Y/6YeYc8+MYnZUH7uAMXV6kscg9C5fK9JixSldOOS05AQZAdEty9ESjFNNg== +"@angular/platform-browser-dynamic@~10.0.0": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.0.1.tgz#2dc05ef6bbc2a554fb55753c8708b42220fb784b" + integrity sha512-4UBee6XEFwTONWKypPftVx5eUzbzcoLKmviXLME65hLd/kEbygzRp10hwsz6UmJCoVGcK/JZAw+UFQnI1iReuA== dependencies: tslib "^2.0.0" -"@angular/platform-browser@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-10.0.0.tgz#88cb200f611032c8fd2a54d3d87bda85c09f9dca" - integrity sha512-2gp53WjGUrL1uReewU21IZJa4KFpbigCyDYB0j/KwTkIGrdwYCOjD0/04oHYjkpazPe/VIu3aN7Gb3PgUa3X/Q== +"@angular/platform-browser@~10.0.0": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-10.0.1.tgz#ee1fb9777a5a50e9b97057a49f3fd0551c52870d" + integrity sha512-xX/vwxWxQ2d52TVqAkSZBKnO8fd+cxuvoFjWTcdhWm91/U75em0WGxQHn2xwmERaAqezsovY/qeU4DDpOMsJxQ== dependencies: tslib "^2.0.0" @@ -165,6 +165,13 @@ dependencies: "@babel/highlight" "^7.8.3" +"@babel/code-frame@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.3.tgz#324bcfd8d35cd3d47dae18cde63d752086435e9a" + integrity sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg== + dependencies: + "@babel/highlight" "^7.10.3" + "@babel/core@^7.1.0", "@babel/core@^7.7.5": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" @@ -252,6 +259,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== +"@babel/helper-plugin-utils@^7.10.1": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz#aac45cccf8bc1873b99a85f34bceef3beb5d3244" + integrity sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g== + "@babel/helper-replace-supers@^7.8.6": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" @@ -277,6 +289,11 @@ dependencies: "@babel/types" "^7.8.3" +"@babel/helper-validator-identifier@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz#60d9847f98c4cea1b279e005fdb7c28be5412d15" + integrity sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw== + "@babel/helper-validator-identifier@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" @@ -291,6 +308,15 @@ "@babel/traverse" "^7.9.0" "@babel/types" "^7.9.0" +"@babel/highlight@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.3.tgz#c633bb34adf07c5c13156692f5922c81ec53f28d" + integrity sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw== + dependencies: + "@babel/helper-validator-identifier" "^7.10.3" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/highlight@^7.8.3": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" @@ -305,20 +331,97 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== -"@babel/plugin-syntax-bigint@^7.0.0": +"@babel/parser@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.3.tgz#7e71d892b0d6e7d04a1af4c3c79d72c1f10f5315" + integrity sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-object-rest-spread@^7.0.0": +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz#d5bc0645913df5b17ad7eda0fa2308330bde34c5" + integrity sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.1.tgz#3e59120ed8b3c2ccc5abb1cfc7aaa3ea01cd36b6" + integrity sha512-ypC4jwfIVF72og0dgvEcFRdOM2V9Qm1tu7RGmdZOlhsccyK0wisXmMObGuWEOd5jQ+K9wcIgSNftCpk2vkjUfQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.1.tgz#fffee77b4934ce77f3b427649ecdddbec1958550" + integrity sha512-XyHIFa9kdrgJS91CUH+ccPVTnJShr8nLGc5bG2IhGXv5p1Rd+8BleGE5yzIg2Nc1QZAdHDa0Qp4m6066OL96Iw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz#25761ee7410bc8cf97327ba741ee94e4a61b7d99" + integrity sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/template@^7.3.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.3.tgz#4d13bc8e30bf95b0ce9d175d30306f42a2c9a7b8" + integrity sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA== + dependencies: + "@babel/code-frame" "^7.10.3" + "@babel/parser" "^7.10.3" + "@babel/types" "^7.10.3" + "@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" @@ -352,6 +455,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.10.3", "@babel/types@^7.3.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.3.tgz#6535e3b79fea86a6b09e012ea8528f935099de8e" + integrity sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.3" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -380,43 +492,44 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -"@jest/console@^25.2.3": - version "25.2.3" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-25.2.3.tgz#38ac19b916ff61457173799239472659e1a67c39" - integrity sha512-k+37B1aSvOt9tKHWbZZSOy1jdgzesB0bj96igCVUG1nAH1W5EoUfgc5EXbBVU08KSLvkVdWopLXaO3xfVGlxtQ== +"@jest/console@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-25.5.0.tgz#770800799d510f37329c508a9edd0b7b447d9abb" + integrity sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw== dependencies: - "@jest/source-map" "^25.2.1" + "@jest/types" "^25.5.0" chalk "^3.0.0" - jest-util "^25.2.3" + jest-message-util "^25.5.0" + jest-util "^25.5.0" slash "^3.0.0" -"@jest/core@^25.2.4": - version "25.2.4" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-25.2.4.tgz#382ef80369d3311f1df79db1ee19e958ae95cdad" - integrity sha512-WcWYShl0Bqfcb32oXtjwbiR78D/djhMdJW+ulp4/bmHgeODcsieqUJfUH+kEv8M7VNV77E6jds5aA+WuGh1nmg== +"@jest/core@^25.2.7", "@jest/core@^25.5.4": + version "25.5.4" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-25.5.4.tgz#3ef7412f7339210f003cdf36646bbca786efe7b4" + integrity sha512-3uSo7laYxF00Dg/DMgbn4xMJKmDdWvZnf89n8Xj/5/AeQ2dOQmn6b6Hkj/MleyzZWXpwv+WSdYWl4cLsy2JsoA== dependencies: - "@jest/console" "^25.2.3" - "@jest/reporters" "^25.2.4" - "@jest/test-result" "^25.2.4" - "@jest/transform" "^25.2.4" - "@jest/types" "^25.2.3" + "@jest/console" "^25.5.0" + "@jest/reporters" "^25.5.1" + "@jest/test-result" "^25.5.0" + "@jest/transform" "^25.5.1" + "@jest/types" "^25.5.0" ansi-escapes "^4.2.1" chalk "^3.0.0" exit "^0.1.2" - graceful-fs "^4.2.3" - jest-changed-files "^25.2.3" - jest-config "^25.2.4" - jest-haste-map "^25.2.3" - jest-message-util "^25.2.4" - jest-regex-util "^25.2.1" - jest-resolve "^25.2.3" - jest-resolve-dependencies "^25.2.4" - jest-runner "^25.2.4" - jest-runtime "^25.2.4" - jest-snapshot "^25.2.4" - jest-util "^25.2.3" - jest-validate "^25.2.3" - jest-watcher "^25.2.4" + graceful-fs "^4.2.4" + jest-changed-files "^25.5.0" + jest-config "^25.5.4" + jest-haste-map "^25.5.1" + jest-message-util "^25.5.0" + jest-regex-util "^25.2.6" + jest-resolve "^25.5.1" + jest-resolve-dependencies "^25.5.4" + jest-runner "^25.5.4" + jest-runtime "^25.5.4" + jest-snapshot "^25.5.1" + jest-util "^25.5.0" + jest-validate "^25.5.0" + jest-watcher "^25.5.0" micromatch "^4.0.2" p-each-series "^2.1.0" realpath-native "^2.0.0" @@ -424,102 +537,112 @@ slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^25.2.4": - version "25.2.4" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-25.2.4.tgz#74f4d8dd87b427434d0b822cde37bc0e78f3e28b" - integrity sha512-wA4xlhD19/gukkDpJ5HQsTle0pgnzI5qMFEjw267lpTDC8d9N7Ihqr5pI+l0p8Qn1SQhai+glSqxrGdzKy4jxw== +"@jest/environment@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-25.5.0.tgz#aa33b0c21a716c65686638e7ef816c0e3a0c7b37" + integrity sha512-U2VXPEqL07E/V7pSZMSQCvV5Ea4lqOlT+0ZFijl/i316cRMHvZ4qC+jBdryd+lmRetjQo0YIQr6cVPNxxK87mA== dependencies: - "@jest/fake-timers" "^25.2.4" - "@jest/types" "^25.2.3" - jest-mock "^25.2.3" + "@jest/fake-timers" "^25.5.0" + "@jest/types" "^25.5.0" + jest-mock "^25.5.0" -"@jest/fake-timers@^25.2.4": - version "25.2.4" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-25.2.4.tgz#6821b6edde74fda2a42467ae92cc93095d4c9527" - integrity sha512-oC1TJiwfMcBttVN7Wz+VZnqEAgYTiEMu0QLOXpypR89nab0uCB31zm/QeBZddhSstn20qe3yqOXygp6OwvKT/Q== +"@jest/fake-timers@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-25.5.0.tgz#46352e00533c024c90c2bc2ad9f2959f7f114185" + integrity sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ== dependencies: - "@jest/types" "^25.2.3" - jest-message-util "^25.2.4" - jest-mock "^25.2.3" - jest-util "^25.2.3" + "@jest/types" "^25.5.0" + jest-message-util "^25.5.0" + jest-mock "^25.5.0" + jest-util "^25.5.0" lolex "^5.0.0" -"@jest/reporters@^25.2.4": - version "25.2.4" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-25.2.4.tgz#aa01c20aab217150d3a6080d5c98ce0bf34b17ed" - integrity sha512-VHbLxM03jCc+bTLOluW/IqHR2G0Cl0iATwIQbuZtIUast8IXO4fD0oy4jpVGpG5b20S6REA8U3BaQoCW/CeVNQ== +"@jest/globals@^25.5.2": + version "25.5.2" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-25.5.2.tgz#5e45e9de8d228716af3257eeb3991cc2e162ca88" + integrity sha512-AgAS/Ny7Q2RCIj5kZ+0MuKM1wbF0WMLxbCVl/GOMoCNbODRdJ541IxJ98xnZdVSZXivKpJlNPIWa3QmY0l4CXA== + dependencies: + "@jest/environment" "^25.5.0" + "@jest/types" "^25.5.0" + expect "^25.5.0" + +"@jest/reporters@^25.5.1": + version "25.5.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-25.5.1.tgz#cb686bcc680f664c2dbaf7ed873e93aa6811538b" + integrity sha512-3jbd8pPDTuhYJ7vqiHXbSwTJQNavczPs+f1kRprRDxETeE3u6srJ+f0NPuwvOmk+lmunZzPkYWIFZDLHQPkviw== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^25.2.3" - "@jest/test-result" "^25.2.4" - "@jest/transform" "^25.2.4" - "@jest/types" "^25.2.3" + "@jest/console" "^25.5.0" + "@jest/test-result" "^25.5.0" + "@jest/transform" "^25.5.1" + "@jest/types" "^25.5.0" chalk "^3.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.2" + graceful-fs "^4.2.4" istanbul-lib-coverage "^3.0.0" istanbul-lib-instrument "^4.0.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.0" - jest-haste-map "^25.2.3" - jest-resolve "^25.2.3" - jest-util "^25.2.3" - jest-worker "^25.2.1" + istanbul-reports "^3.0.2" + jest-haste-map "^25.5.1" + jest-resolve "^25.5.1" + jest-util "^25.5.0" + jest-worker "^25.5.0" slash "^3.0.0" source-map "^0.6.0" string-length "^3.1.0" terminal-link "^2.0.0" - v8-to-istanbul "^4.0.1" + v8-to-istanbul "^4.1.3" optionalDependencies: node-notifier "^6.0.0" -"@jest/source-map@^25.2.1": - version "25.2.1" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-25.2.1.tgz#b62ecf8ae76170b08eff8859b56eb7576df34ab8" - integrity sha512-PgScGJm1U27+9Te/cxP4oUFqJ2PX6NhBL2a6unQ7yafCgs8k02c0LSyjSIx/ao0AwcAdCczfAPDf5lJ7zoB/7A== +"@jest/source-map@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-25.5.0.tgz#df5c20d6050aa292c2c6d3f0d2c7606af315bd1b" + integrity sha512-eIGx0xN12yVpMcPaVpjXPnn3N30QGJCJQSkEDUt9x1fI1Gdvb07Ml6K5iN2hG7NmMP6FDmtPEssE3z6doOYUwQ== dependencies: callsites "^3.0.0" - graceful-fs "^4.2.3" + graceful-fs "^4.2.4" source-map "^0.6.0" -"@jest/test-result@^25.2.4": - version "25.2.4" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-25.2.4.tgz#8fc9eac58e82eb2a82e4058e68c3814f98f59cf5" - integrity sha512-AI7eUy+q2lVhFnaibDFg68NGkrxVWZdD6KBr9Hm6EvN0oAe7GxpEwEavgPfNHQjU2mi6g+NsFn/6QPgTUwM1qg== +"@jest/test-result@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-25.5.0.tgz#139a043230cdeffe9ba2d8341b27f2efc77ce87c" + integrity sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A== dependencies: - "@jest/console" "^25.2.3" - "@jest/transform" "^25.2.4" - "@jest/types" "^25.2.3" + "@jest/console" "^25.5.0" + "@jest/types" "^25.5.0" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^25.2.4": - version "25.2.4" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-25.2.4.tgz#28364aeddec140c696324114f63570f3de536c87" - integrity sha512-TEZm/Rkd6YgskdpTJdYLBtu6Gc11tfWPuSpatq0duH77ekjU8dpqX2zkPdY/ayuHxztV5LTJoV5BLtI9mZfXew== +"@jest/test-sequencer@^25.5.4": + version "25.5.4" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-25.5.4.tgz#9b4e685b36954c38d0f052e596d28161bdc8b737" + integrity sha512-pTJGEkSeg1EkCO2YWq6hbFvKNXk8ejqlxiOg1jBNLnWrgXOkdY6UmqZpwGFXNnRt9B8nO1uWMzLLZ4eCmhkPNA== dependencies: - "@jest/test-result" "^25.2.4" - jest-haste-map "^25.2.3" - jest-runner "^25.2.4" - jest-runtime "^25.2.4" + "@jest/test-result" "^25.5.0" + graceful-fs "^4.2.4" + jest-haste-map "^25.5.1" + jest-runner "^25.5.4" + jest-runtime "^25.5.4" -"@jest/transform@^25.2.4": - version "25.2.4" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.2.4.tgz#34336f37f13f62f7d1f5b93d5d150ba9eb3e11b9" - integrity sha512-6eRigvb+G6bs4kW5j1/y8wu4nCrmVuIe0epPBbiWaYlwawJ8yi1EIyK3d/btDqmBpN5GpN4YhR6iPPnDmkYdTA== +"@jest/transform@^25.5.1": + version "25.5.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.5.1.tgz#0469ddc17699dd2bf985db55fa0fb9309f5c2db3" + integrity sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg== dependencies: "@babel/core" "^7.1.0" - "@jest/types" "^25.2.3" + "@jest/types" "^25.5.0" babel-plugin-istanbul "^6.0.0" chalk "^3.0.0" convert-source-map "^1.4.0" fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.3" - jest-haste-map "^25.2.3" - jest-regex-util "^25.2.1" - jest-util "^25.2.3" + graceful-fs "^4.2.4" + jest-haste-map "^25.5.1" + jest-regex-util "^25.2.6" + jest-util "^25.5.0" micromatch "^4.0.2" pirates "^4.0.1" realpath-native "^2.0.0" @@ -527,6 +650,16 @@ source-map "^0.6.1" write-file-atomic "^3.0.0" +"@jest/types@^25.1.0", "@jest/types@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" + integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^15.0.0" + chalk "^3.0.0" + "@jest/types@^25.2.3": version "25.2.3" resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.2.3.tgz#035c4fb94e2da472f359ff9a211915d59987f6b6" @@ -628,10 +761,10 @@ dependencies: defer-to-connect "^1.0.1" -"@types/babel__core@^7.1.0": - version "7.1.6" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.6.tgz#16ff42a5ae203c9af1c6e190ed1f30f83207b610" - integrity sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg== +"@types/babel__core@^7.1.7": + version "7.1.9" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d" + integrity sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -671,17 +804,24 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/execa@^2.0.0": +"@types/execa@~2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/execa/-/execa-2.0.0.tgz#4dd5523520c51834bf8d0c280f460814e5238281" integrity sha512-aBnkJ0r3khaZkHzu9pDZeWXrDg1N/ZtDGRQkK+KIqNVvvTvW+URXMUHQQCQMYdb2GPrcwu9Fq6l9iiT+pirIbg== dependencies: execa "*" -"@types/fs-extra@^8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-8.1.0.tgz#1114834b53c3914806cd03b3304b37b3bd221a4d" - integrity sha512-UoOfVEzAUpeSPmjm7h1uk5MH6KZma2z2O7a75onTGjnNvAvMVrPzPL/vBbT65iIGHWj6rokwfmYcmxmlSf2uwg== +"@types/fs-extra@~8.1.0": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-8.1.1.tgz#1e49f22d09aa46e19b51c0b013cb63d0d923a068" + integrity sha512-TcUlBem321DFQzBNuz8p0CLLKp0VvF/XH9E4KHNmgwyp4E3AfgI5cjiIVZWlbfThBop2qxFIh4+LeY6hVWWZ2w== + dependencies: + "@types/node" "*" + +"@types/graceful-fs@^4.1.2": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.3.tgz#039af35fe26bec35003e8d86d2ee9c586354348f" + integrity sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ== dependencies: "@types/node" "*" @@ -705,23 +845,23 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" -"@types/jest@^25.1.4": - version "25.1.4" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.1.4.tgz#9e9f1e59dda86d3fd56afce71d1ea1b331f6f760" - integrity sha512-QDDY2uNAhCV7TMCITrxz+MRk1EizcsevzfeS6LykIlq2V1E5oO4wXG8V2ZEd9w7Snxeeagk46YbMgZ8ESHx3sw== +"@types/jest@~25.1.4": + version "25.1.5" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.1.5.tgz#3c3c078b3cd19c6403e21277f1cfdc0ce5ebf9a9" + integrity sha512-FBmb9YZHoEOH56Xo/PIYtfuyTL0IzJLM3Hy0Sqc82nn5eqqXgefKcl/eMgChM8eSGVfoDee8cdlj7K74T8a6Yg== dependencies: - jest-diff "^25.1.0" - pretty-format "^25.1.0" + jest-diff "25.1.0" + pretty-format "25.1.0" "@types/node@*": version "13.9.5" resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.5.tgz#59738bf30b31aea1faa2df7f4a5f55613750cf00" integrity sha512-hkzMMD3xu6BrJpGVLeQ3htQQNAcOrJjX7WFmtK8zWQpz2UJf13LCFF2ALA7c9OVdvc2vQJeDdjfR35M0sBCxvw== -"@types/node@^12.11.1": - version "12.12.32" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.32.tgz#0ccc836d273e8a3cddf568daf22729cfa57c1925" - integrity sha512-44/reuCrwiQEsXud3I5X3sqI5jIXAmHB5xoiyKUw965olNHF3IWKjBLKK3F9LOSUZmK+oDt8jmyO637iX+hMgA== +"@types/node@~12.11.1": + version "12.11.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.11.7.tgz#57682a9771a3f7b09c2497f28129a0462966524a" + integrity sha512-JNbGaHFCLwgHn/iCckiGSOZ1XYHsKFwREtzPwSGCVld1SGhOlmZw2D4ZI94HQCrBHbADzW9m4LER/8olJTRGHA== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -839,16 +979,6 @@ agentkeepalive@^3.4.1: dependencies: humanize-ms "^1.2.1" -ajv@6.10.2: - version "6.10.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" - integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - ajv@6.12.0, ajv@^6.10.2, ajv@^6.5.5: version "6.12.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" @@ -1086,24 +1216,23 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== -axobject-query@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.2.tgz#ea187abe5b9002b377f925d8bf7d1c561adf38f9" - integrity sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww== - dependencies: - ast-types-flow "0.0.7" +axobject-query@^2.0.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== -babel-jest@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.2.4.tgz#b21b68d3af8f161c3e6e501e91f0dea8e652e344" - integrity sha512-+yDzlyJVWrqih9i2Cvjpt7COaN8vUwCsKGtxJLzg6I0xhxD54K8mvDUCliPKLufyzHh/c5C4MRj4Vk7VMjOjIg== +babel-jest@^25.5.1: + version "25.5.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.5.1.tgz#bc2e6101f849d6f6aec09720ffc7bc5332e62853" + integrity sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ== dependencies: - "@jest/transform" "^25.2.4" - "@jest/types" "^25.2.3" - "@types/babel__core" "^7.1.0" + "@jest/transform" "^25.5.1" + "@jest/types" "^25.5.0" + "@types/babel__core" "^7.1.7" babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^25.2.1" + babel-preset-jest "^25.5.0" chalk "^3.0.0" + graceful-fs "^4.2.4" slash "^3.0.0" babel-plugin-istanbul@^6.0.0: @@ -1117,21 +1246,39 @@ babel-plugin-istanbul@^6.0.0: istanbul-lib-instrument "^4.0.0" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^25.2.1: - version "25.2.1" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.1.tgz#d0003a1f3d5caa281e1107fe03bbf16b799f9955" - integrity sha512-HysbCQfJhxLlyxDbKcB2ucGYV0LjqK4h6dBoI3RtFuOxTiTWK6XGZMsHb0tGh8iJdV4hC6Z2GCHzVvDeh9i0lQ== +babel-plugin-jest-hoist@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.5.0.tgz#129c80ba5c7fc75baf3a45b93e2e372d57ca2677" + integrity sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g== dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" "@types/babel__traverse" "^7.0.6" -babel-preset-jest@^25.2.1: - version "25.2.1" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.2.1.tgz#4ccd0e577f69aa11b71806edfe8b25a5c3ac93a2" - integrity sha512-zXHJBM5iR8oEO4cvdF83AQqqJf3tJrXy3x8nfu2Nlqvn4cneg4Ca8M7cQvC5S9BzDDy1O0tZ9iXru9J6E3ym+A== - dependencies: - "@babel/plugin-syntax-bigint" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - babel-plugin-jest-hoist "^25.2.1" +babel-preset-current-node-syntax@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz#b4b547acddbf963cba555ba9f9cbbb70bfd044da" + integrity sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +babel-preset-jest@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.5.0.tgz#c1d7f191829487a907764c65307faa0e66590b49" + integrity sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw== + dependencies: + babel-plugin-jest-hoist "^25.5.0" + babel-preset-current-node-syntax "^0.1.2" balanced-match@^1.0.0: version "1.0.0" @@ -1532,14 +1679,14 @@ coa@^2.0.2: chalk "^2.4.1" q "^1.1.2" -codelyzer@^5.1.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-5.2.2.tgz#d0530a455784e6bea0b6d7e97166c73c30a5347f" - integrity sha512-jB4FZ1Sx7kZhvZVdf+N2BaKTdrrNZOL0Bj10RRfrhHrb3zEvXjJvvq298JPMJAiyiCS/v4zs1QlGU0ip7xGqeA== +codelyzer@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-5.1.2.tgz#e6c08269f8796483e57e6d9b7c29723572472b1d" + integrity sha512-1z7mtpwxcz5uUqq0HLO0ifj/tz2dWEmeaK+8c5TEZXAwwVxrjjg0118ODCOCCOcpfYaaEHxStNCaWVYo9FUPXw== dependencies: app-root-path "^2.2.1" aria-query "^3.0.0" - axobject-query "2.0.2" + axobject-query "^2.0.2" css-selector-tokenizer "^0.7.1" cssauron "^1.4.0" damerau-levenshtein "^1.0.4" @@ -2055,10 +2202,10 @@ dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" -diff-sequences@^25.2.1: - version "25.2.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.1.tgz#fcfe8aa07dd9b0c648396a478dabca8e76c6ab27" - integrity sha512-foe7dXnGlSh3jR1ovJmdv+77VQj98eKCHHwJPbZ2eEf0fHwKbkZicpPxEch9smZ+n2dnF6QFwkOQdLq9hpeJUg== +diff-sequences@^25.1.0, diff-sequences@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" + integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== diff@^4.0.1: version "4.0.2" @@ -2293,7 +2440,7 @@ exec-sh@^0.3.2: resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== -execa@*, execa@^4.0.0: +execa@*: version "4.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.0.tgz#7f37d6ec17f09e6b8fc53288611695b6d12b9daf" integrity sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA== @@ -2337,6 +2484,21 @@ execa@^3.2.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@~4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.2.tgz#ad87fb7b2d9d564f70d2b62d511bee41d5cbb240" + integrity sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -2355,17 +2517,17 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expect@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/expect/-/expect-25.2.4.tgz#b66e0777c861034ebc21730bb34e1839d5d46806" - integrity sha512-hfuPhPds4yOsZtIw4kwAg70r0hqGmpqekgA+VX7pf/3wZ6FY+xIOXZhNsPMMMsspYG/YIsbAiwqsdnD4Ht+bCA== +expect@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-25.5.0.tgz#f07f848712a2813bb59167da3fb828ca21f58bba" + integrity sha512-w7KAXo0+6qqZZhovCaBVPSIqQp7/UTcx4M9uKt2m6pd2VB1voyC8JizLRqeEqud3AAVP02g+hbErDu5gu64tlA== dependencies: - "@jest/types" "^25.2.3" + "@jest/types" "^25.5.0" ansi-styles "^4.0.0" - jest-get-type "^25.2.1" - jest-matcher-utils "^25.2.3" - jest-message-util "^25.2.4" - jest-regex-util "^25.2.1" + jest-get-type "^25.2.6" + jest-matcher-utils "^25.5.0" + jest-message-util "^25.5.0" + jest-regex-util "^25.2.6" extend-shallow@^2.0.1: version "2.0.1" @@ -2420,21 +2582,11 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= - fast-deep-equal@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== -fast-json-stable-stringify@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= - fast-json-stable-stringify@2.1.0, fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -2567,6 +2719,16 @@ fs-extra@^9.0.0: jsonfile "^6.0.1" universalify "^1.0.0" +fs-extra@~9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" + integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^1.0.0" + fs-minipass@^1.2.5: version "1.2.7" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" @@ -2700,12 +2862,12 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.15: +graceful-fs@^4.1.15, graceful-fs@^4.2.4: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== @@ -3348,10 +3510,10 @@ istanbul-lib-source-maps@^4.0.0: istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.1.tgz#1343217244ad637e0c3b18e7f6b746941a9b5e9a" - integrity sha512-Vm9xwCiQ8t2cNNnckyeAV0UdxKpcQUz4nMxsBvIu8n2kmPSiyb5uaF/8LpmKr+yqL/MdOXaX2Nmdo4Qyxium9Q== +istanbul-reports@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -3375,127 +3537,140 @@ jasminewd2@^2.1.0: resolved "https://registry.yarnpkg.com/jasminewd2/-/jasminewd2-2.2.0.tgz#e37cf0b17f199cce23bea71b2039395246b4ec4e" integrity sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4= -jest-changed-files@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-25.2.3.tgz#ad19deef9e47ba37efb432d2c9a67dfd97cc78af" - integrity sha512-EFxy94dvvbqRB36ezIPLKJ4fDIC+jAdNs8i8uTwFpaXd6H3LVc3ova1lNS4ZPWk09OCR2vq5kSdSQgar7zMORg== +jest-changed-files@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-25.5.0.tgz#141cc23567ceb3f534526f8614ba39421383634c" + integrity sha512-EOw9QEqapsDT7mKF162m8HFzRPbmP8qJQny6ldVOdOVBz3ACgPm/1nAn5fPQ/NDaYhX/AHkrGwwkCncpAVSXcw== dependencies: - "@jest/types" "^25.2.3" + "@jest/types" "^25.5.0" execa "^3.2.0" throat "^5.0.0" -jest-cli@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-25.2.4.tgz#021c2383904696597abc060dcb133c82ebd8bfcc" - integrity sha512-zeY2pRDWKj2LZudIncvvguwLMEdcnJqc2jJbwza1beqi80qqLvkPF/BjbFkK2sIV3r+mfTJS+7ITrvK6pCdRjg== +jest-cli@^25.2.7: + version "25.5.4" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-25.5.4.tgz#b9f1a84d1301a92c5c217684cb79840831db9f0d" + integrity sha512-rG8uJkIiOUpnREh1768/N3n27Cm+xPFkSNFO91tgg+8o2rXeVLStz+vkXkGr4UtzH6t1SNbjwoiswd7p4AhHTw== dependencies: - "@jest/core" "^25.2.4" - "@jest/test-result" "^25.2.4" - "@jest/types" "^25.2.3" + "@jest/core" "^25.5.4" + "@jest/test-result" "^25.5.0" + "@jest/types" "^25.5.0" chalk "^3.0.0" exit "^0.1.2" + graceful-fs "^4.2.4" import-local "^3.0.2" is-ci "^2.0.0" - jest-config "^25.2.4" - jest-util "^25.2.3" - jest-validate "^25.2.3" + jest-config "^25.5.4" + jest-util "^25.5.0" + jest-validate "^25.5.0" prompts "^2.0.1" realpath-native "^2.0.0" yargs "^15.3.1" -jest-config@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-25.2.4.tgz#f4f33238979f225683179c89d1e402893008975d" - integrity sha512-fxy3nIpwJqOUQJRVF/q+pNQb6dv5b9YufOeCbpPZJ/md1zXpiupbhfehpfODhnKOfqbzSiigtSLzlWWmbRxnqQ== +jest-config@^25.5.4: + version "25.5.4" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-25.5.4.tgz#38e2057b3f976ef7309b2b2c8dcd2a708a67f02c" + integrity sha512-SZwR91SwcdK6bz7Gco8qL7YY2sx8tFJYzvg216DLihTWf+LKY/DoJXpM9nTzYakSyfblbqeU48p/p7Jzy05Atg== dependencies: "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^25.2.4" - "@jest/types" "^25.2.3" - babel-jest "^25.2.4" + "@jest/test-sequencer" "^25.5.4" + "@jest/types" "^25.5.0" + babel-jest "^25.5.1" chalk "^3.0.0" deepmerge "^4.2.2" glob "^7.1.1" - jest-environment-jsdom "^25.2.4" - jest-environment-node "^25.2.4" - jest-get-type "^25.2.1" - jest-jasmine2 "^25.2.4" - jest-regex-util "^25.2.1" - jest-resolve "^25.2.3" - jest-util "^25.2.3" - jest-validate "^25.2.3" + graceful-fs "^4.2.4" + jest-environment-jsdom "^25.5.0" + jest-environment-node "^25.5.0" + jest-get-type "^25.2.6" + jest-jasmine2 "^25.5.4" + jest-regex-util "^25.2.6" + jest-resolve "^25.5.1" + jest-util "^25.5.0" + jest-validate "^25.5.0" micromatch "^4.0.2" - pretty-format "^25.2.3" + pretty-format "^25.5.0" realpath-native "^2.0.0" -jest-diff@^25.1.0, jest-diff@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.2.3.tgz#54d601a0a754ef26e808a8c8dbadd278c215aa3f" - integrity sha512-VtZ6LAQtaQpFsmEzps15dQc5ELbJxy4L2DOSo2Ev411TUEtnJPkAMD7JneVypeMJQ1y3hgxN9Ao13n15FAnavg== +jest-diff@25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.1.0.tgz#58b827e63edea1bc80c1de952b80cec9ac50e1ad" + integrity sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw== dependencies: chalk "^3.0.0" - diff-sequences "^25.2.1" - jest-get-type "^25.2.1" - pretty-format "^25.2.3" + diff-sequences "^25.1.0" + jest-get-type "^25.1.0" + pretty-format "^25.1.0" -jest-docblock@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-25.2.3.tgz#ac45280c43d59e7139f9fbe5896c6e0320c01ebb" - integrity sha512-d3/tmjLLrH5fpRGmIm3oFa3vOaD/IjPxtXVOrfujpfJ9y1tCDB1x/tvunmdOVAyF03/xeMwburl6ITbiQT1mVA== +jest-diff@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.5.0.tgz#1dd26ed64f96667c068cef026b677dfa01afcfa9" + integrity sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A== dependencies: - detect-newline "^3.0.0" + chalk "^3.0.0" + diff-sequences "^25.2.6" + jest-get-type "^25.2.6" + pretty-format "^25.5.0" -jest-each@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-25.2.3.tgz#64067ba1508ebbd07e9b126c173ab371e8e6309d" - integrity sha512-RTlmCjsBDK2c9T5oO4MqccA3/5Y8BUtiEy7OOQik1iyCgdnNdHbI0pNEpyapZPBG0nlvZ4mIu7aY6zNUvLraAQ== +jest-docblock@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-25.3.0.tgz#8b777a27e3477cd77a168c05290c471a575623ef" + integrity sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg== dependencies: - "@jest/types" "^25.2.3" - chalk "^3.0.0" - jest-get-type "^25.2.1" - jest-util "^25.2.3" - pretty-format "^25.2.3" + detect-newline "^3.0.0" -jest-environment-jsdom@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-25.2.4.tgz#f2783541d0538b1bc43641703372cea6a2e83611" - integrity sha512-5dm+tNwrLmhELdjAwiQnVGf/U9iFMWdTL4/wyrMg2HU6RQnCiuxpWbIigLHUhuP1P2Ak0F4k3xhjrikboKyShA== +jest-each@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-25.5.0.tgz#0c3c2797e8225cb7bec7e4d249dcd96b934be516" + integrity sha512-QBogUxna3D8vtiItvn54xXde7+vuzqRrEeaw8r1s+1TG9eZLVJE5ZkKoSUlqFwRjnlaA4hyKGiu9OlkFIuKnjA== dependencies: - "@jest/environment" "^25.2.4" - "@jest/fake-timers" "^25.2.4" - "@jest/types" "^25.2.3" - jest-mock "^25.2.3" - jest-util "^25.2.3" + "@jest/types" "^25.5.0" + chalk "^3.0.0" + jest-get-type "^25.2.6" + jest-util "^25.5.0" + pretty-format "^25.5.0" + +jest-environment-jsdom@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-25.5.0.tgz#dcbe4da2ea997707997040ecf6e2560aec4e9834" + integrity sha512-7Jr02ydaq4jaWMZLY+Skn8wL5nVIYpWvmeatOHL3tOcV3Zw8sjnPpx+ZdeBfc457p8jCR9J6YCc+Lga0oIy62A== + dependencies: + "@jest/environment" "^25.5.0" + "@jest/fake-timers" "^25.5.0" + "@jest/types" "^25.5.0" + jest-mock "^25.5.0" + jest-util "^25.5.0" jsdom "^15.2.1" -jest-environment-node@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-25.2.4.tgz#dc211dfb0d8b66dfc1965a8f846e72e54ff0c430" - integrity sha512-Jkc5Y8goyXPrLRHnrUlqC7P4o5zn2m4zw6qWoRJ59kxV1f2a5wK+TTGhrhCwnhW/Ckpdl/pm+LufdvhJkvJbiw== +jest-environment-node@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-25.5.0.tgz#0f55270d94804902988e64adca37c6ce0f7d07a1" + integrity sha512-iuxK6rQR2En9EID+2k+IBs5fCFd919gVVK5BeND82fYeLWPqvRcFNPKu9+gxTwfB5XwBGBvZ0HFQa+cHtIoslA== dependencies: - "@jest/environment" "^25.2.4" - "@jest/fake-timers" "^25.2.4" - "@jest/types" "^25.2.3" - jest-mock "^25.2.3" - jest-util "^25.2.3" + "@jest/environment" "^25.5.0" + "@jest/fake-timers" "^25.5.0" + "@jest/types" "^25.5.0" + jest-mock "^25.5.0" + jest-util "^25.5.0" semver "^6.3.0" -jest-get-type@^25.2.1: - version "25.2.1" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.1.tgz#6c83de603c41b1627e6964da2f5454e6aa3c13a6" - integrity sha512-EYjTiqcDTCRJDcSNKbLTwn/LcDPEE7ITk8yRMNAOjEsN6yp+Uu+V1gx4djwnuj/DvWg0YGmqaBqPVGsPxlvE7w== +jest-get-type@^25.1.0, jest-get-type@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" + integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig== -jest-haste-map@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.2.3.tgz#2649392b5af191f0167a27bfb62e5d96d7eaaade" - integrity sha512-pAP22OHtPr4qgZlJJFks2LLgoQUr4XtM1a+F5UaPIZNiCRnePA0hM3L7aiJ0gzwiNIYwMTfKRwG/S1L28J3A3A== +jest-haste-map@^25.5.1: + version "25.5.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.5.1.tgz#1df10f716c1d94e60a1ebf7798c9fb3da2620943" + integrity sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ== dependencies: - "@jest/types" "^25.2.3" + "@jest/types" "^25.5.0" + "@types/graceful-fs" "^4.1.2" anymatch "^3.0.3" fb-watchman "^2.0.0" - graceful-fs "^4.2.3" - jest-serializer "^25.2.1" - jest-util "^25.2.3" - jest-worker "^25.2.1" + graceful-fs "^4.2.4" + jest-serializer "^25.5.0" + jest-util "^25.5.0" + jest-worker "^25.5.0" micromatch "^4.0.2" sane "^4.0.3" walker "^1.0.7" @@ -3503,74 +3678,74 @@ jest-haste-map@^25.2.3: optionalDependencies: fsevents "^2.1.2" -jest-jasmine2@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-25.2.4.tgz#5f77de83e1027f0c7588137055a80da773872374" - integrity sha512-juoKrmNmLwaheNbAg71SuUF9ovwUZCFNTpKVhvCXWk+SSeORcIUMptKdPCoLXV3D16htzhTSKmNxnxSk4SrTjA== +jest-jasmine2@^25.5.4: + version "25.5.4" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-25.5.4.tgz#66ca8b328fb1a3c5364816f8958f6970a8526968" + integrity sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ== dependencies: "@babel/traverse" "^7.1.0" - "@jest/environment" "^25.2.4" - "@jest/source-map" "^25.2.1" - "@jest/test-result" "^25.2.4" - "@jest/types" "^25.2.3" + "@jest/environment" "^25.5.0" + "@jest/source-map" "^25.5.0" + "@jest/test-result" "^25.5.0" + "@jest/types" "^25.5.0" chalk "^3.0.0" co "^4.6.0" - expect "^25.2.4" + expect "^25.5.0" is-generator-fn "^2.0.0" - jest-each "^25.2.3" - jest-matcher-utils "^25.2.3" - jest-message-util "^25.2.4" - jest-runtime "^25.2.4" - jest-snapshot "^25.2.4" - jest-util "^25.2.3" - pretty-format "^25.2.3" + jest-each "^25.5.0" + jest-matcher-utils "^25.5.0" + jest-message-util "^25.5.0" + jest-runtime "^25.5.4" + jest-snapshot "^25.5.1" + jest-util "^25.5.0" + pretty-format "^25.5.0" throat "^5.0.0" -jest-leak-detector@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-25.2.3.tgz#4cf39f137925e0061c04c24ca65cae36465f0238" - integrity sha512-yblCMPE7NJKl7778Cf/73yyFWAas5St0iiEBwq7RDyaz6Xd4WPFnPz2j7yDb/Qce71A1IbDoLADlcwD8zT74Aw== +jest-leak-detector@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-25.5.0.tgz#2291c6294b0ce404241bb56fe60e2d0c3e34f0bb" + integrity sha512-rV7JdLsanS8OkdDpZtgBf61L5xZ4NnYLBq72r6ldxahJWWczZjXawRsoHyXzibM5ed7C2QRjpp6ypgwGdKyoVA== dependencies: - jest-get-type "^25.2.1" - pretty-format "^25.2.3" + jest-get-type "^25.2.6" + pretty-format "^25.5.0" -jest-matcher-utils@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.2.3.tgz#59285bd6d6c810debc9caa585ed985e46a3f28fd" - integrity sha512-ZmiXiwQRVM9MoKjGMP5YsGGk2Th5ncyRxfXKz5AKsmU8m43kgNZirckVzaP61MlSa9LKmXbevdYqVp1ZKAw2Rw== +jest-matcher-utils@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz#fbc98a12d730e5d2453d7f1ed4a4d948e34b7867" + integrity sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw== dependencies: chalk "^3.0.0" - jest-diff "^25.2.3" - jest-get-type "^25.2.1" - pretty-format "^25.2.3" + jest-diff "^25.5.0" + jest-get-type "^25.2.6" + pretty-format "^25.5.0" -jest-message-util@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.2.4.tgz#b1441b9c82f5c11fc661303cbf200a2f136a7762" - integrity sha512-9wWMH3Bf+GVTv0GcQLmH/FRr0x0toptKw9TA8U5YFLVXx7Tq9pvcNzTyJrcTJ+wLqNbMPPJlJNft4MnlcrtF5Q== +jest-message-util@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.5.0.tgz#ea11d93204cc7ae97456e1d8716251185b8880ea" + integrity sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA== dependencies: "@babel/code-frame" "^7.0.0" - "@jest/test-result" "^25.2.4" - "@jest/types" "^25.2.3" + "@jest/types" "^25.5.0" "@types/stack-utils" "^1.0.1" chalk "^3.0.0" + graceful-fs "^4.2.4" micromatch "^4.0.2" slash "^3.0.0" stack-utils "^1.0.1" -jest-mock@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-25.2.3.tgz#b37a581f59d61bd91db27a99bf7eb8b3e5e993d5" - integrity sha512-xlf+pyY0j47zoCs8zGGOGfWyxxLximE8YFOfEK8s4FruR8DtM/UjNj61um+iDuMAFEBDe1bhCXkqiKoCmWjJzg== +jest-mock@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-25.5.0.tgz#a91a54dabd14e37ecd61665d6b6e06360a55387a" + integrity sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA== dependencies: - "@jest/types" "^25.2.3" + "@jest/types" "^25.5.0" jest-pnp-resolver@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== -jest-preset-angular@^8.0.0, jest-preset-angular@^8.1.2: +jest-preset-angular@^8.1.2: version "8.1.2" resolved "https://registry.yarnpkg.com/jest-preset-angular/-/jest-preset-angular-8.1.2.tgz#2dc49e852351aa1d58ffdb94fce4bd9d4b5a59e2" integrity sha512-a6RPuWIUAnEBq3nsgwh6B+ZaJ1wYF7ChvNNBp4vS9lM9OG8r2waa4+OpIQDZJ9ptERDsPC2vjr6QY3R0ai9vcw== @@ -3578,163 +3753,179 @@ jest-preset-angular@^8.0.0, jest-preset-angular@^8.1.2: pretty-format "^25.0.0" ts-jest "^25.0.0" -jest-regex-util@^25.2.1: - version "25.2.1" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.2.1.tgz#db64b0d15cd3642c93b7b9627801d7c518600584" - integrity sha512-wroFVJw62LdqTdkL508ZLV82FrJJWVJMIuYG7q4Uunl1WAPTf4ftPKrqqfec4SvOIlvRZUdEX2TFpWR356YG/w== +jest-preset-angular@~8.1.2: + version "8.1.3" + resolved "https://registry.yarnpkg.com/jest-preset-angular/-/jest-preset-angular-8.1.3.tgz#99951afe34ffa5a3d2fd879936515d3235e3567a" + integrity sha512-T53bmWG4mNynumYcWqvhKGslQCJCTFpcL3SMrggrI65hI2G0ErYZ6WtdJqPDsFFk+KRN+iNLwNBG1idHO9k2uQ== + dependencies: + pretty-format "^25.0.0" + ts-jest "^25.0.0" + +jest-regex-util@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.2.6.tgz#d847d38ba15d2118d3b06390056028d0f2fd3964" + integrity sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw== -jest-resolve-dependencies@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.2.4.tgz#2d904400387d74a366dff54badb40a2b3210e733" - integrity sha512-qhUnK4PfNHzNdca7Ub1mbAqE0j5WNyMTwxBZZJjQlUrdqsiYho/QGK65FuBkZuSoYtKIIqriR9TpGrPEc3P5Gg== +jest-resolve-dependencies@^25.5.4: + version "25.5.4" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.5.4.tgz#85501f53957c8e3be446e863a74777b5a17397a7" + integrity sha512-yFmbPd+DAQjJQg88HveObcGBA32nqNZ02fjYmtL16t1xw9bAttSn5UGRRhzMHIQbsep7znWvAvnD4kDqOFM0Uw== dependencies: - "@jest/types" "^25.2.3" - jest-regex-util "^25.2.1" - jest-snapshot "^25.2.4" + "@jest/types" "^25.5.0" + jest-regex-util "^25.2.6" + jest-snapshot "^25.5.1" -jest-resolve@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-25.2.3.tgz#ababeaf2bb948cb6d2dea8453759116da0fb7842" - integrity sha512-1vZMsvM/DBH258PnpUNSXIgtzpYz+vCVCj9+fcy4akZl4oKbD+9hZSlfe9RIDpU0Fc28ozHQrmwX3EqFRRIHGg== +jest-resolve@^25.5.1: + version "25.5.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-25.5.1.tgz#0e6fbcfa7c26d2a5fe8f456088dc332a79266829" + integrity sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ== dependencies: - "@jest/types" "^25.2.3" + "@jest/types" "^25.5.0" browser-resolve "^1.11.3" chalk "^3.0.0" + graceful-fs "^4.2.4" jest-pnp-resolver "^1.2.1" + read-pkg-up "^7.0.1" realpath-native "^2.0.0" - resolve "^1.15.1" + resolve "^1.17.0" + slash "^3.0.0" -jest-runner@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.2.4.tgz#d0daf7c56b4a83b6b675863d5cdcd502c960f9a1" - integrity sha512-5xaIfqqxck9Wg2CV4b9KmJtf/sWO7zWQx7O+34GCLGPzoPcVmB3mZtdrQI1/jS3Reqjru9ycLjgLHSf6XoxRqA== +jest-runner@^25.5.4: + version "25.5.4" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.5.4.tgz#ffec5df3875da5f5c878ae6d0a17b8e4ecd7c71d" + integrity sha512-V/2R7fKZo6blP8E9BL9vJ8aTU4TH2beuqGNxHbxi6t14XzTb+x90B3FRgdvuHm41GY8ch4xxvf0ATH4hdpjTqg== dependencies: - "@jest/console" "^25.2.3" - "@jest/environment" "^25.2.4" - "@jest/test-result" "^25.2.4" - "@jest/types" "^25.2.3" + "@jest/console" "^25.5.0" + "@jest/environment" "^25.5.0" + "@jest/test-result" "^25.5.0" + "@jest/types" "^25.5.0" chalk "^3.0.0" exit "^0.1.2" - graceful-fs "^4.2.3" - jest-config "^25.2.4" - jest-docblock "^25.2.3" - jest-haste-map "^25.2.3" - jest-jasmine2 "^25.2.4" - jest-leak-detector "^25.2.3" - jest-message-util "^25.2.4" - jest-resolve "^25.2.3" - jest-runtime "^25.2.4" - jest-util "^25.2.3" - jest-worker "^25.2.1" + graceful-fs "^4.2.4" + jest-config "^25.5.4" + jest-docblock "^25.3.0" + jest-haste-map "^25.5.1" + jest-jasmine2 "^25.5.4" + jest-leak-detector "^25.5.0" + jest-message-util "^25.5.0" + jest-resolve "^25.5.1" + jest-runtime "^25.5.4" + jest-util "^25.5.0" + jest-worker "^25.5.0" source-map-support "^0.5.6" throat "^5.0.0" -jest-runtime@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-25.2.4.tgz#c66a421e115944426b377a7fd331f6c0902cfa56" - integrity sha512-6ehOUizgIghN+aV5YSrDzTZ+zJ9omgEjJbTHj3Jqes5D52XHfhzT7cSfdREwkNjRytrR7mNwZ7pRauoyNLyJ8Q== - dependencies: - "@jest/console" "^25.2.3" - "@jest/environment" "^25.2.4" - "@jest/source-map" "^25.2.1" - "@jest/test-result" "^25.2.4" - "@jest/transform" "^25.2.4" - "@jest/types" "^25.2.3" +jest-runtime@^25.5.4: + version "25.5.4" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-25.5.4.tgz#dc981fe2cb2137abcd319e74ccae7f7eeffbfaab" + integrity sha512-RWTt8LeWh3GvjYtASH2eezkc8AehVoWKK20udV6n3/gC87wlTbE1kIA+opCvNWyyPeBs6ptYsc6nyHUb1GlUVQ== + dependencies: + "@jest/console" "^25.5.0" + "@jest/environment" "^25.5.0" + "@jest/globals" "^25.5.2" + "@jest/source-map" "^25.5.0" + "@jest/test-result" "^25.5.0" + "@jest/transform" "^25.5.1" + "@jest/types" "^25.5.0" "@types/yargs" "^15.0.0" chalk "^3.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.3" - graceful-fs "^4.2.3" - jest-config "^25.2.4" - jest-haste-map "^25.2.3" - jest-message-util "^25.2.4" - jest-mock "^25.2.3" - jest-regex-util "^25.2.1" - jest-resolve "^25.2.3" - jest-snapshot "^25.2.4" - jest-util "^25.2.3" - jest-validate "^25.2.3" + graceful-fs "^4.2.4" + jest-config "^25.5.4" + jest-haste-map "^25.5.1" + jest-message-util "^25.5.0" + jest-mock "^25.5.0" + jest-regex-util "^25.2.6" + jest-resolve "^25.5.1" + jest-snapshot "^25.5.1" + jest-util "^25.5.0" + jest-validate "^25.5.0" realpath-native "^2.0.0" slash "^3.0.0" strip-bom "^4.0.0" yargs "^15.3.1" -jest-serializer@^25.2.1: - version "25.2.1" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.2.1.tgz#51727a5fc04256f461abe0fa024a022ba165877a" - integrity sha512-fibDi7M5ffx6c/P66IkvR4FKkjG5ldePAK1WlbNoaU4GZmIAkS9Le/frAwRUFEX0KdnisSPWf+b1RC5jU7EYJQ== +jest-serializer@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.5.0.tgz#a993f484e769b4ed54e70e0efdb74007f503072b" + integrity sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA== + dependencies: + graceful-fs "^4.2.4" -jest-snapshot@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-25.2.4.tgz#08d4517579c864df4280bcc948ceea34327a4ded" - integrity sha512-nIwpW7FZCq5p0AE3Oyqyb6jL0ENJixXzJ5/CD/XRuOqp3gS5OM3O/k+NnTrniCXxPFV4ry6s9HNfiPQBi0wcoA== +jest-snapshot@^25.5.1: + version "25.5.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-25.5.1.tgz#1a2a576491f9961eb8d00c2e5fd479bc28e5ff7f" + integrity sha512-C02JE1TUe64p2v1auUJ2ze5vcuv32tkv9PyhEb318e8XOKF7MOyXdJ7kdjbvrp3ChPLU2usI7Rjxs97Dj5P0uQ== dependencies: "@babel/types" "^7.0.0" - "@jest/types" "^25.2.3" + "@jest/types" "^25.5.0" "@types/prettier" "^1.19.0" chalk "^3.0.0" - expect "^25.2.4" - jest-diff "^25.2.3" - jest-get-type "^25.2.1" - jest-matcher-utils "^25.2.3" - jest-message-util "^25.2.4" - jest-resolve "^25.2.3" + expect "^25.5.0" + graceful-fs "^4.2.4" + jest-diff "^25.5.0" + jest-get-type "^25.2.6" + jest-matcher-utils "^25.5.0" + jest-message-util "^25.5.0" + jest-resolve "^25.5.1" make-dir "^3.0.0" natural-compare "^1.4.0" - pretty-format "^25.2.3" + pretty-format "^25.5.0" semver "^6.3.0" -jest-util@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.2.3.tgz#0abf95a1d6b96f2de5a3ecd61b36c40a182dc256" - integrity sha512-7tWiMICVSo9lNoObFtqLt9Ezt5exdFlWs5fLe1G4XLY2lEbZc814cw9t4YHScqBkWMfzth8ASHKlYBxiX2rdCw== +jest-util@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.5.0.tgz#31c63b5d6e901274d264a4fec849230aa3fa35b0" + integrity sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA== dependencies: - "@jest/types" "^25.2.3" + "@jest/types" "^25.5.0" chalk "^3.0.0" + graceful-fs "^4.2.4" is-ci "^2.0.0" make-dir "^3.0.0" -jest-validate@^25.2.3: - version "25.2.3" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-25.2.3.tgz#ecb0f093cf8ae71d15075fb48439b6f78f1fcb5a" - integrity sha512-GObn91jzU0B0Bv4cusAwjP6vnWy78hJUM8MOSz7keRfnac/ZhQWIsUjvk01IfeXNTemCwgR57EtdjQMzFZGREg== +jest-validate@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-25.5.0.tgz#fb4c93f332c2e4cf70151a628e58a35e459a413a" + integrity sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ== dependencies: - "@jest/types" "^25.2.3" + "@jest/types" "^25.5.0" camelcase "^5.3.1" chalk "^3.0.0" - jest-get-type "^25.2.1" + jest-get-type "^25.2.6" leven "^3.1.0" - pretty-format "^25.2.3" + pretty-format "^25.5.0" -jest-watcher@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-25.2.4.tgz#dda85b914d470fa4145164a8f70bda4f208bafb6" - integrity sha512-p7g7s3zqcy69slVzQYcphyzkB2FBmJwMbv6k6KjI5mqd6KnUnQPfQVKuVj2l+34EeuxnbXqnrjtUFmxhcL87rg== +jest-watcher@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-25.5.0.tgz#d6110d101df98badebe435003956fd4a465e8456" + integrity sha512-XrSfJnVASEl+5+bb51V0Q7WQx65dTSk7NL4yDdVjPnRNpM0hG+ncFmDYJo9O8jaSRcAitVbuVawyXCRoxGrT5Q== dependencies: - "@jest/test-result" "^25.2.4" - "@jest/types" "^25.2.3" + "@jest/test-result" "^25.5.0" + "@jest/types" "^25.5.0" ansi-escapes "^4.2.1" chalk "^3.0.0" - jest-util "^25.2.3" + jest-util "^25.5.0" string-length "^3.1.0" -jest-worker@^25.2.1: - version "25.2.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.2.1.tgz#209617015c768652646aa33a7828cc2ab472a18a" - integrity sha512-IHnpekk8H/hCUbBlfeaPZzU6v75bqwJp3n4dUrQuQOAgOneI4tx3jV2o8pvlXnDfcRsfkFIUD//HWXpCmR+evQ== +jest-worker@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" + integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== dependencies: merge-stream "^2.0.0" supports-color "^7.0.0" -jest@^25.2.4: - version "25.2.4" - resolved "https://registry.yarnpkg.com/jest/-/jest-25.2.4.tgz#d10941948a2b57eb7accc2e7ae78af4a0e11b40a" - integrity sha512-Lu4LXxf4+durzN/IFilcAoQSisOwgHIXgl9vffopePpSSwFqfj1Pj4y+k3nL8oTbnvjxgDIsEcepy6he4bWqnQ== +jest@~25.2.4: + version "25.2.7" + resolved "https://registry.yarnpkg.com/jest/-/jest-25.2.7.tgz#3929a5f35cdd496f7756876a206b99a94e1e09ae" + integrity sha512-XV1n/CE2McCikl4tfpCY950RytHYvxdo/wvtgmn/qwA8z1s16fuvgFL/KoPrrmkqJTaPMUlLVE58pwiaTX5TdA== dependencies: - "@jest/core" "^25.2.4" + "@jest/core" "^25.2.7" import-local "^3.0.2" - jest-cli "^25.2.4" + jest-cli "^25.2.7" js-tokens@^4.0.0: version "4.0.0" @@ -3869,7 +4060,7 @@ jszip@^3.1.3: readable-stream "~2.3.6" set-immediate-shim "~1.0.1" -just-compare@^1.3.0: +just-compare@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/just-compare/-/just-compare-1.3.0.tgz#a53c31373f150a5b238555c243af4d8a38d7a0e5" integrity sha512-i4QNo3mPYubDmAwPbCKQl5C2b5s0yudP5V5GDp6lGR1PM22Em4Idf7mcaIzXYcL6/RLdZtuGrAqkBe9RYM/t4w== @@ -4025,13 +4216,6 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -magic-string@0.25.4: - version "0.25.4" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.4.tgz#325b8a0a79fc423db109b77fd5a19183b7ba5143" - integrity sha512-oycWO9nEVAP2RVPbIoDoA4Y7LFIJ3xRYov93gAyJhZkET1tNuB0u7uWkZS2LpBWTJUWnmau/To8ECWRC+jKNfw== - dependencies: - sourcemap-codec "^1.4.4" - magic-string@0.25.7, magic-string@^0.25.0, magic-string@^0.25.2: version "0.25.7" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" @@ -4280,7 +4464,7 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -ng-packagr@^10.0.0: +ng-packagr@~10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/ng-packagr/-/ng-packagr-10.0.0.tgz#e6fd0d2e144cf92de92ba4d7d37b9da0bdb131f1" integrity sha512-g+xrHgaF1P8URFb2JZZ4TpTD1uSN1JCHyiP3+PVUp/J8q69QRw9A8dl3JiosgbklUcVif2OnoHTpxNtLcVQ7gw== @@ -5185,7 +5369,17 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -pretty-format@^25.0.0, pretty-format@^25.1.0, pretty-format@^25.2.3: +pretty-format@25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.1.0.tgz#ed869bdaec1356fc5ae45de045e2c8ec7b07b0c8" + integrity sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ== + dependencies: + "@jest/types" "^25.1.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + +pretty-format@^25.0.0, pretty-format@^25.1.0: version "25.2.3" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.2.3.tgz#ba6e9603a0d80fa2e470b1fed55de1f9bfd81421" integrity sha512-IP4+5UOAVGoyqC/DiomOeHBUKN6q00gfyT2qpAsRH64tgOKB2yF7FHJXC18OCiU0/YFierACup/zdCOWw0F/0w== @@ -5195,6 +5389,16 @@ pretty-format@^25.0.0, pretty-format@^25.1.0, pretty-format@^25.2.3: ansi-styles "^4.0.0" react-is "^16.12.0" +pretty-format@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" + integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== + dependencies: + "@jest/types" "^25.5.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -5362,7 +5566,16 @@ read-pkg-up@^5.0.0: find-up "^3.0.0" read-pkg "^5.0.0" -read-pkg@^5.0.0: +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.0.0, read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== @@ -5559,13 +5772,20 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@1.x, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.14.2, resolve@^1.15.1, resolve@^1.3.2: +resolve@1.x, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.14.2, resolve@^1.3.2: version "1.15.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== dependencies: path-parse "^1.0.6" +resolve@^1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -5649,13 +5869,6 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" - integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== - dependencies: - tslib "^1.9.0" - rxjs@6.5.4, rxjs@^6.5.0, rxjs@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" @@ -6465,7 +6678,7 @@ tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== -tslib@^2.0.0: +tslib@^2.0.0, tslib@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.0.tgz#18d13fc2dce04051e20f074cc8387fd8089ce4f3" integrity sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g== @@ -6723,10 +6936,10 @@ uuid@^3.0.0, uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -v8-to-istanbul@^4.0.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.1.3.tgz#22fe35709a64955f49a08a7c7c959f6520ad6f20" - integrity sha512-sAjOC+Kki6aJVbUOXJbcR0MnbfjvBzwKZazEJymA2IX49uoOdEdk+4fBq5cXgYgiyKtAyrrJNtBZdOeDIF+Fng== +v8-to-istanbul@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz#b97936f21c0e2d9996d4985e5c5156e9d4e49cd6" + integrity sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ== dependencies: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" diff --git a/npm/packs/virtual-file-explorer/package.json b/npm/packs/virtual-file-explorer/package.json index e9b768ba85..510f5a3ce9 100644 --- a/npm/packs/virtual-file-explorer/package.json +++ b/npm/packs/virtual-file-explorer/package.json @@ -5,8 +5,8 @@ "access": "public" }, "dependencies": { - "@abp/clipboard": "^2.9.0", - "@abp/prismjs": "^2.9.0" + "@abp/clipboard": "~2.9.0", + "@abp/prismjs": "~2.9.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } From fc5836dd2116360ab7cee2681023d7a5e56b29bf Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Mon, 29 Jun 2020 17:11:56 +0800 Subject: [PATCH 126/190] Restore the constant class definition of the Identity module. --- .../Volo/Abp/Identity/IdentityClaimTypeConsts.cs | 8 ++++---- .../Volo/Abp/Identity/IdentityRoleConsts.cs | 4 ++-- .../Volo/Abp/Identity/IdentityUserConsts.cs | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityClaimTypeConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityClaimTypeConsts.cs index d3ceb03812..f8335caeb6 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityClaimTypeConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityClaimTypeConsts.cs @@ -2,9 +2,9 @@ { public class IdentityClaimTypeConsts { - public const int MaxNameLength = 256; - public const int MaxRegexLength = 512; - public const int MaxRegexDescriptionLength = 128; - public const int MaxDescriptionLength = 256; + public static int MaxNameLength { get; set; } = 256; + public static int MaxRegexLength { get; set; } = 512; + public static int MaxRegexDescriptionLength { get; set; } = 128; + public static int MaxDescriptionLength { get; set; } = 256; } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityRoleConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityRoleConsts.cs index 11bde27f34..9d9cc9d9f6 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityRoleConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityRoleConsts.cs @@ -2,7 +2,7 @@ { public static class IdentityRoleConsts { - public const int MaxNameLength = 256; - public const int MaxNormalizedNameLength = MaxNameLength; + public static int MaxNameLength { get; set; } = 256; + public static int MaxNormalizedNameLength { get; set; } = 256; } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserConsts.cs index 07de4c425e..ad3fb0f586 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserConsts.cs @@ -22,6 +22,6 @@ namespace Volo.Abp.Identity public static int MaxPasswordHashLength { get; set; } = 256; - public const int MaxSecurityStampLength = 256; + public static int MaxSecurityStampLength { get; set; } = 256; } } From 4d3a54f4a370353a177f2ab63f48fd3c2ca8861a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87otur?= Date: Mon, 29 Jun 2020 12:39:25 +0300 Subject: [PATCH 127/190] initial --- .../AbpValidationAttributeAdapterProvider.cs | 5 +++ .../DynamicMaxLengthAttributeAdapter.cs | 45 +++++++++++++++++++ .../Validation/DynamicMaxLengthAttribute.cs | 39 ++++++++++++++++ .../Validation/ValidationTestController.cs | 11 +++-- .../ValidationTestController_Tests.cs | 9 +++- 5 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicMaxLengthAttributeAdapter.cs create mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicMaxLengthAttribute.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/AbpValidationAttributeAdapterProvider.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/AbpValidationAttributeAdapterProvider.cs index eaceddba70..c9b7cb21b3 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/AbpValidationAttributeAdapterProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/AbpValidationAttributeAdapterProvider.cs @@ -22,6 +22,11 @@ namespace Volo.Abp.AspNetCore.Mvc.DataAnnotations { return new DynamicStringLengthAttributeAdapter((DynamicStringLengthAttribute) attribute, stringLocalizer); } + + if (type == typeof(DynamicMaxLengthAttribute)) + { + return new DynamicMaxLengthAttributeAdapter((DynamicMaxLengthAttribute) attribute, stringLocalizer); + } return _defaultAdapter.GetAttributeAdapter(attribute, stringLocalizer); } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicMaxLengthAttributeAdapter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicMaxLengthAttributeAdapter.cs new file mode 100644 index 0000000000..ca3b3ce7ab --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicMaxLengthAttributeAdapter.cs @@ -0,0 +1,45 @@ +using System.Globalization; +using Microsoft.AspNetCore.Mvc.DataAnnotations; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using Microsoft.Extensions.Localization; +using Volo.Abp.Validation; + +namespace Volo.Abp.AspNetCore.Mvc.DataAnnotations +{ + public class DynamicMaxLengthAttributeAdapter : AttributeAdapterBase + { + private readonly string _max; + + public DynamicMaxLengthAttributeAdapter( + DynamicMaxLengthAttribute attribute, + IStringLocalizer stringLocalizer) + : base(attribute, stringLocalizer) + { + _max = Attribute.Length.ToString(CultureInfo.InvariantCulture); + } + + public override string GetErrorMessage(ModelValidationContextBase validationContext) + { + Check.NotNull(validationContext, nameof(validationContext)); + + return GetErrorMessage( + validationContext.ModelMetadata, + validationContext.ModelMetadata.GetDisplayName(), + Attribute.Length + ); + } + + public override void AddValidation(ClientModelValidationContext context) + { + Check.NotNull(context, nameof(context)); + + MergeAttribute(context.Attributes, "data-val", "true"); + MergeAttribute(context.Attributes, "data-val-length", GetErrorMessage(context)); + + if (Attribute.Length != int.MaxValue) + { + MergeAttribute(context.Attributes, "data-val-length-max", _max); + } + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicMaxLengthAttribute.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicMaxLengthAttribute.cs new file mode 100644 index 0000000000..c76a54bdc2 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicMaxLengthAttribute.cs @@ -0,0 +1,39 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics; +using System.Reflection; +using JetBrains.Annotations; + +namespace Volo.Abp.Validation +{ + public class DynamicMaxLengthAttribute : MaxLengthAttribute + { + private static readonly FieldInfo MaximumLengthField; + + static DynamicMaxLengthAttribute() + { + MaximumLengthField = typeof(MaxLengthAttribute).GetField( + "k__BackingField", + BindingFlags.Instance | BindingFlags.NonPublic + ); + Debug.Assert(MaximumLengthField != null, nameof(MaximumLengthField) + " != null"); + } + + public DynamicMaxLengthAttribute( + [NotNull] Type sourceType, + [CanBeNull] string maximumLengthPropertyName) + { + Check.NotNull(sourceType, nameof(sourceType)); + + if (maximumLengthPropertyName != null) + { + var maximumLengthProperty = sourceType.GetProperty( + maximumLengthPropertyName, + BindingFlags.Static | BindingFlags.Public + ); + Debug.Assert(maximumLengthProperty != null, nameof(maximumLengthProperty) + " != null"); + MaximumLengthField.SetValue(this, (int) maximumLengthProperty.GetValue(null)); + } + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController.cs index ae622acee2..df033c99b5 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController.cs @@ -50,13 +50,18 @@ namespace Volo.Abp.AspNetCore.Mvc.Validation public class ValidationDynamicTestModel { - [DynamicStringLength(typeof(Consts), nameof(Consts.MaxValue2Length), nameof(Consts.MinValue2Length))] + [DynamicStringLength(typeof(Consts), nameof(Consts.MaxValue1Length), nameof(Consts.MinValue1Length))] public string Value1 { get; set; } + [DynamicMaxLength(typeof(Consts), nameof(Consts.MaxValue2Length))] + public string Value2 { get; set; } + public static class Consts { - public static int MinValue2Length { get; set; } = 2; - public static int MaxValue2Length { get; set; } = 7; + public static int MinValue1Length { get; set; } = 2; + public static int MaxValue1Length { get; set; } = 7; + + public static int MaxValue2Length { get; set; } = 4; } } diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController_Tests.cs index 767ff7aa3e..6a16e8e899 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController_Tests.cs @@ -63,15 +63,20 @@ namespace Volo.Abp.AspNetCore.Mvc.Validation { var result = await GetResponseAsStringAsync("/api/validation-test/object-result-action-dynamic-length?value1=hello"); result.ShouldBe("hello"); + } [Fact] public async Task Should_Validate_Dynamic_Length_Object_Result_Failing() { - var result = await GetResponseAsObjectAsync("/api/validation-test/object-result-action-dynamic-length?value1=a", HttpStatusCode.BadRequest); //value1 has min length of 2 chars. + var result = await GetResponseAsObjectAsync("/api/validation-test/object-result-action-dynamic-length?value1=a", HttpStatusCode.BadRequest); //value1 has min string length of 2 chars. + result.Error.ValidationErrors.Length.ShouldBeGreaterThan(0); + + result = await GetResponseAsObjectAsync("/api/validation-test/object-result-action-dynamic-length?value1=12345678", HttpStatusCode.BadRequest); //value1 has max string length of 7 chars. result.Error.ValidationErrors.Length.ShouldBeGreaterThan(0); - result = await GetResponseAsObjectAsync("/api/validation-test/object-result-action-dynamic-length?value1=12345678", HttpStatusCode.BadRequest); //value1 has max length of 7 chars. + + result = await GetResponseAsObjectAsync("/api/validation-test/object-result-action-dynamic-length?value1=123458&value2=12345", HttpStatusCode.BadRequest); //value2 has max length of 5 chars. result.Error.ValidationErrors.Length.ShouldBeGreaterThan(0); } } From 8308054e418f8ae24b4ff83ddefc4c71f787e17f Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 29 Jun 2020 12:47:01 +0300 Subject: [PATCH 128/190] fix: ngx-datatable localization problem resolves #4421 --- .../ngx-datatable-list.directive.ts | 21 +++++++++++++++++-- .../src/lib/theme-shared.module.ts | 21 ------------------- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-list.directive.ts b/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-list.directive.ts index a16925ebd7..131ae88fc5 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-list.directive.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-list.directive.ts @@ -1,4 +1,4 @@ -import { ListService } from '@abp/ng.core'; +import { ListService, LocalizationService } from '@abp/ng.core'; import { ChangeDetectorRef, Directive, @@ -21,9 +21,26 @@ export class NgxDatatableListDirective implements OnChanges, OnDestroy, OnInit { @Input() list: ListService; - constructor(private table: DatatableComponent, private cdRef: ChangeDetectorRef) { + constructor( + private table: DatatableComponent, + private cdRef: ChangeDetectorRef, + private localizationService: LocalizationService, + ) { + this.setInitialValues(); + } + + private setInitialValues() { this.table.externalPaging = true; this.table.externalSorting = true; + this.table.messages = { + emptyMessage: this.localizationService.localizeSync( + 'AbpUi', + 'NoDataAvailableInDatatable', + 'No data available', + ), + totalMessage: this.localizationService.localizeSync('AbpUi', 'Total', 'total'), + selectedMessage: this.localizationService.localizeSync('AbpUi', 'Selected', 'selected'), + }; } private subscribeToPage() { diff --git a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts index 127fdcc2a3..18f7e2007d 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts @@ -31,22 +31,6 @@ import { THEME_SHARED_APPEND_CONTENT } from './tokens/append-content.token'; import { httpErrorConfigFactory, HTTP_ERROR_CONFIG } from './tokens/http-error.token'; import { DateParserFormatter } from './utils/date-parser-formatter'; -export function ngxDatatableMessageFactory(store: Store) { - const emptyMessage = store.selectSnapshot( - ConfigState.getLocalization('AbpUi::NoDataAvailableInDatatable'), - ); - const totalMessage = store.selectSnapshot(ConfigState.getLocalization('AbpUi::Total')); - const selectedMessage = store.selectSnapshot(ConfigState.getLocalization('AbpUi::Selected')); - - return { - messages: { - emptyMessage, - totalMessage, - selectedMessage, - }, - } as INgxDatatableConfig; -} - @NgModule({ imports: [CoreModule, NgxDatatableModule, NgxValidateCoreModule, NgbPaginationModule], declarations: [ @@ -126,11 +110,6 @@ export class ThemeSharedModule { deps: [HTTP_ERROR_CONFIG], }, { provide: NgbDateParserFormatter, useClass: DateParserFormatter }, - { - provide: 'configuration', - useFactory: ngxDatatableMessageFactory, - deps: [Store], - }, ], }; } From 56cf234a6e5d837b28054a802b45688827f5f9d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87otur?= Date: Mon, 29 Jun 2020 12:55:25 +0300 Subject: [PATCH 129/190] tests added --- .../Volo/Abp/Validation/DynamicMaxLengthAttribute.cs | 2 +- .../AspNetCore/Mvc/Validation/ValidationTestController.cs | 5 +++++ .../Mvc/Validation/ValidationTestController_Tests.cs | 6 ++++-- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicMaxLengthAttribute.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicMaxLengthAttribute.cs index c76a54bdc2..59d5bcfa47 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicMaxLengthAttribute.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicMaxLengthAttribute.cs @@ -13,7 +13,7 @@ namespace Volo.Abp.Validation static DynamicMaxLengthAttribute() { MaximumLengthField = typeof(MaxLengthAttribute).GetField( - "k__BackingField", + "k__BackingField", BindingFlags.Instance | BindingFlags.NonPublic ); Debug.Assert(MaximumLengthField != null, nameof(MaximumLengthField) + " != null"); diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController.cs index df033c99b5..6ce47c4679 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController.cs @@ -56,12 +56,17 @@ namespace Volo.Abp.AspNetCore.Mvc.Validation [DynamicMaxLength(typeof(Consts), nameof(Consts.MaxValue2Length))] public string Value2 { get; set; } + [DynamicMaxLength(typeof(Consts), nameof(Consts.MaxValue3Length))] + public int[] Value3 { get; set; } + public static class Consts { public static int MinValue1Length { get; set; } = 2; public static int MaxValue1Length { get; set; } = 7; public static int MaxValue2Length { get; set; } = 4; + + public static int MaxValue3Length { get; set; } = 2; } } diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController_Tests.cs index 6a16e8e899..9e22784ba7 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Validation/ValidationTestController_Tests.cs @@ -61,7 +61,7 @@ namespace Volo.Abp.AspNetCore.Mvc.Validation [Fact] public async Task Should_Validate_Dynamic_Length_Object_Result_Success() { - var result = await GetResponseAsStringAsync("/api/validation-test/object-result-action-dynamic-length?value1=hello"); + var result = await GetResponseAsStringAsync("/api/validation-test/object-result-action-dynamic-length?value1=hello&value3[0]=53&value3[1]=54"); result.ShouldBe("hello"); } @@ -75,9 +75,11 @@ namespace Volo.Abp.AspNetCore.Mvc.Validation result = await GetResponseAsObjectAsync("/api/validation-test/object-result-action-dynamic-length?value1=12345678", HttpStatusCode.BadRequest); //value1 has max string length of 7 chars. result.Error.ValidationErrors.Length.ShouldBeGreaterThan(0); - result = await GetResponseAsObjectAsync("/api/validation-test/object-result-action-dynamic-length?value1=123458&value2=12345", HttpStatusCode.BadRequest); //value2 has max length of 5 chars. result.Error.ValidationErrors.Length.ShouldBeGreaterThan(0); + + result = await GetResponseAsObjectAsync("/api/validation-test/object-result-action-dynamic-length?value1=123458&value3[0]=53&value3[1]=54&value3[2]=55&value3[3]=56", HttpStatusCode.BadRequest); //value3 has max length of 2. + result.Error.ValidationErrors.Length.ShouldBeGreaterThan(0); } } } From 3d8b3d96b1db50f69af31bbde47facf118ead83f Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 29 Jun 2020 13:20:16 +0300 Subject: [PATCH 130/190] chore: change some version suffix of some packages --- npm/packs/anchor-js/package.json | 2 +- npm/packs/aspnetcore.mvc.ui/package.json | 12 ++++---- npm/packs/bootstrap-datepicker/package.json | 2 +- npm/packs/bootstrap/package.json | 2 +- npm/packs/chart.js/package.json | 2 +- npm/packs/clipboard/package.json | 2 +- npm/packs/codemirror/package.json | 2 +- npm/packs/datatables.net-bs4/package.json | 2 +- npm/packs/datatables.net/package.json | 2 +- npm/packs/flag-icon-css/package.json | 2 +- npm/packs/font-awesome/package.json | 2 +- npm/packs/jquery-form/package.json | 2 +- .../package.json | 2 +- npm/packs/jquery-validation/package.json | 2 +- npm/packs/jstree/package.json | 2 +- npm/packs/lodash/package.json | 2 +- npm/packs/luxon/package.json | 2 +- .../package.json | 2 +- npm/packs/markdown-it/package.json | 2 +- npm/packs/owl.carousel/package.json | 2 +- npm/packs/popper.js/package.json | 2 +- npm/packs/prismjs/package.json | 2 +- npm/packs/select2/package.json | 2 +- npm/packs/sweetalert/package.json | 2 +- npm/packs/timeago/package.json | 2 +- npm/packs/toastr/package.json | 2 +- npm/packs/tui-editor/package.json | 2 +- npm/packs/uppy/package.json | 2 +- npm/packs/utils/package.json | 28 +++++++++---------- 29 files changed, 47 insertions(+), 47 deletions(-) diff --git a/npm/packs/anchor-js/package.json b/npm/packs/anchor-js/package.json index f15601f8eb..4b21f6ca9c 100644 --- a/npm/packs/anchor-js/package.json +++ b/npm/packs/anchor-js/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@abp/core": "~2.9.0", - "anchor-js": "~4.2.2" + "anchor-js": "^4.2.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.mvc.ui/package.json b/npm/packs/aspnetcore.mvc.ui/package.json index fae31b200f..6a83218d4e 100644 --- a/npm/packs/aspnetcore.mvc.ui/package.json +++ b/npm/packs/aspnetcore.mvc.ui/package.json @@ -5,12 +5,12 @@ "access": "public" }, "dependencies": { - "ansi-colors": "~4.1.1", - "extend-object": "~1.0.0", - "gulp": "~4.0.2", - "merge-stream": "~2.0.0", - "path": "~0.12.7", - "rimraf": "~3.0.2" + "ansi-colors": "^4.1.1", + "extend-object": "^1.0.0", + "gulp": "^4.0.2", + "merge-stream": "^2.0.0", + "path": "^0.12.7", + "rimraf": "^3.0.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/bootstrap-datepicker/package.json b/npm/packs/bootstrap-datepicker/package.json index c755a18199..95c506c542 100644 --- a/npm/packs/bootstrap-datepicker/package.json +++ b/npm/packs/bootstrap-datepicker/package.json @@ -5,7 +5,7 @@ "access": "public" }, "dependencies": { - "bootstrap-datepicker": "~1.9.0" + "bootstrap-datepicker": "^1.9.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/bootstrap/package.json b/npm/packs/bootstrap/package.json index d540d0bffb..a409f89ded 100644 --- a/npm/packs/bootstrap/package.json +++ b/npm/packs/bootstrap/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@abp/core": "~2.9.0", - "bootstrap": "~4.5.0", + "bootstrap": "^4.5.0", "bootstrap-v4-rtl": "4.4.1-2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/chart.js/package.json b/npm/packs/chart.js/package.json index d98bece90e..435d1cef93 100644 --- a/npm/packs/chart.js/package.json +++ b/npm/packs/chart.js/package.json @@ -5,7 +5,7 @@ "access": "public" }, "dependencies": { - "chart.js": "~2.9.3" + "chart.js": "^2.9.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/clipboard/package.json b/npm/packs/clipboard/package.json index 42ba81b4ac..46677143b9 100644 --- a/npm/packs/clipboard/package.json +++ b/npm/packs/clipboard/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@abp/core": "~2.9.0", - "clipboard": "~2.0.6" + "clipboard": "^2.0.6" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/codemirror/package.json b/npm/packs/codemirror/package.json index 80d6145831..807eea5cd9 100644 --- a/npm/packs/codemirror/package.json +++ b/npm/packs/codemirror/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@abp/core": "~2.9.0", - "codemirror": "~5.54.0" + "codemirror": "^5.54.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/datatables.net-bs4/package.json b/npm/packs/datatables.net-bs4/package.json index 5a6998c40d..18fefed504 100644 --- a/npm/packs/datatables.net-bs4/package.json +++ b/npm/packs/datatables.net-bs4/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@abp/datatables.net": "~2.9.0", - "datatables.net-bs4": "~1.10.21" + "datatables.net-bs4": "^1.10.21" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/datatables.net/package.json b/npm/packs/datatables.net/package.json index cc6221d5e2..5e522f52f0 100644 --- a/npm/packs/datatables.net/package.json +++ b/npm/packs/datatables.net/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@abp/jquery": "~2.9.0", - "datatables.net": "~1.10.21" + "datatables.net": "^1.10.21" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/flag-icon-css/package.json b/npm/packs/flag-icon-css/package.json index 88471bcb8c..e66cc044fd 100644 --- a/npm/packs/flag-icon-css/package.json +++ b/npm/packs/flag-icon-css/package.json @@ -5,7 +5,7 @@ "access": "public" }, "dependencies": { - "flag-icon-css": "~3.5.0" + "flag-icon-css": "^3.5.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/font-awesome/package.json b/npm/packs/font-awesome/package.json index 5b9b7ec09f..0e29f6eccf 100644 --- a/npm/packs/font-awesome/package.json +++ b/npm/packs/font-awesome/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@abp/core": "~2.9.0", - "@fortawesome/fontawesome-free": "~5.13.0" + "@fortawesome/fontawesome-free": "^5.13.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/jquery-form/package.json b/npm/packs/jquery-form/package.json index 6e14ed8b33..a547261ae5 100644 --- a/npm/packs/jquery-form/package.json +++ b/npm/packs/jquery-form/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@abp/jquery": "~2.9.0", - "jquery-form": "~4.3.0" + "jquery-form": "^4.3.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/jquery-validation-unobtrusive/package.json b/npm/packs/jquery-validation-unobtrusive/package.json index 2f2238395e..1948468f0e 100644 --- a/npm/packs/jquery-validation-unobtrusive/package.json +++ b/npm/packs/jquery-validation-unobtrusive/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@abp/jquery-validation": "~2.9.0", - "jquery-validation-unobtrusive": "~3.2.11" + "jquery-validation-unobtrusive": "^3.2.11" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/jquery-validation/package.json b/npm/packs/jquery-validation/package.json index 593289b918..20704f9d90 100644 --- a/npm/packs/jquery-validation/package.json +++ b/npm/packs/jquery-validation/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@abp/jquery": "~2.9.0", - "jquery-validation": "~1.19.2" + "jquery-validation": "^1.19.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/jstree/package.json b/npm/packs/jstree/package.json index fc72dbe215..086dda9252 100644 --- a/npm/packs/jstree/package.json +++ b/npm/packs/jstree/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@abp/jquery": "~2.9.0", - "jstree": "~3.3.9" + "jstree": "^3.3.9" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/lodash/package.json b/npm/packs/lodash/package.json index 2fb0d8d79e..35c4f1316d 100644 --- a/npm/packs/lodash/package.json +++ b/npm/packs/lodash/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@abp/core": "~2.9.0", - "lodash": "~4.17.15" + "lodash": "^4.17.15" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/luxon/package.json b/npm/packs/luxon/package.json index 1bdd991a4b..489fc20e48 100644 --- a/npm/packs/luxon/package.json +++ b/npm/packs/luxon/package.json @@ -5,7 +5,7 @@ "access": "public" }, "dependencies": { - "luxon": "~1.24.1" + "luxon": "^1.24.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/malihu-custom-scrollbar-plugin/package.json b/npm/packs/malihu-custom-scrollbar-plugin/package.json index c06b5cde77..f68503c079 100644 --- a/npm/packs/malihu-custom-scrollbar-plugin/package.json +++ b/npm/packs/malihu-custom-scrollbar-plugin/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@abp/core": "~2.9.0", - "malihu-custom-scrollbar-plugin": "~3.1.5" + "malihu-custom-scrollbar-plugin": "^3.1.5" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/markdown-it/package.json b/npm/packs/markdown-it/package.json index 801b51b173..47b679b8bc 100644 --- a/npm/packs/markdown-it/package.json +++ b/npm/packs/markdown-it/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@abp/core": "~2.9.0", - "markdown-it": "~11.0.0" + "markdown-it": "^11.0.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/owl.carousel/package.json b/npm/packs/owl.carousel/package.json index 361e3f1706..da6ec4641b 100644 --- a/npm/packs/owl.carousel/package.json +++ b/npm/packs/owl.carousel/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@abp/core": "~2.9.0", - "owl.carousel": "~2.3.4" + "owl.carousel": "^2.3.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/popper.js/package.json b/npm/packs/popper.js/package.json index f7219d380f..fbe0bed687 100644 --- a/npm/packs/popper.js/package.json +++ b/npm/packs/popper.js/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@abp/core": "~2.9.0", - "popper.js": "~1.16.0" + "popper.js": "^1.16.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/prismjs/package.json b/npm/packs/prismjs/package.json index 8e42cfe26b..7d9388e14c 100644 --- a/npm/packs/prismjs/package.json +++ b/npm/packs/prismjs/package.json @@ -7,7 +7,7 @@ "dependencies": { "@abp/clipboard": "~2.9.0", "@abp/core": "~2.9.0", - "prismjs": "~1.20.0" + "prismjs": "^1.20.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/select2/package.json b/npm/packs/select2/package.json index 5e24bb3e2e..9b7a7c7ec7 100644 --- a/npm/packs/select2/package.json +++ b/npm/packs/select2/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@abp/core": "~2.9.0", - "select2": "~4.0.13" + "select2": "^4.0.13" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/sweetalert/package.json b/npm/packs/sweetalert/package.json index 2cc7eb215a..ffcc0854b3 100644 --- a/npm/packs/sweetalert/package.json +++ b/npm/packs/sweetalert/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@abp/core": "~2.9.0", - "sweetalert": "~2.1.2" + "sweetalert": "^2.1.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/timeago/package.json b/npm/packs/timeago/package.json index e28a5111cc..bddafc1773 100644 --- a/npm/packs/timeago/package.json +++ b/npm/packs/timeago/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@abp/jquery": "~2.9.0", - "timeago": "~1.6.7" + "timeago": "^1.6.7" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/toastr/package.json b/npm/packs/toastr/package.json index 81c6f22c05..bf4f03723b 100644 --- a/npm/packs/toastr/package.json +++ b/npm/packs/toastr/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@abp/jquery": "~2.9.0", - "toastr": "~2.1.4" + "toastr": "^2.1.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/tui-editor/package.json b/npm/packs/tui-editor/package.json index 2293636854..65244a2ffb 100644 --- a/npm/packs/tui-editor/package.json +++ b/npm/packs/tui-editor/package.json @@ -9,7 +9,7 @@ "@abp/highlight.js": "~2.9.0", "@abp/jquery": "~2.9.0", "@abp/markdown-it": "~2.9.0", - "tui-editor": "~1.4.10" + "tui-editor": "^1.4.10" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/uppy/package.json b/npm/packs/uppy/package.json index 7ab59402b1..3a514e33d5 100644 --- a/npm/packs/uppy/package.json +++ b/npm/packs/uppy/package.json @@ -6,7 +6,7 @@ }, "dependencies": { "@abp/core": "~2.9.0", - "uppy": "~1.16.1" + "uppy": "^1.16.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/utils/package.json b/npm/packs/utils/package.json index 306f36e74f..e9eb7d6678 100644 --- a/npm/packs/utils/package.json +++ b/npm/packs/utils/package.json @@ -23,7 +23,7 @@ "metadata": "dist/abp-utils.metadata.json", "sideEffects": false, "devDependencies": { - "@angular-builders/jest": "~9.0.0", + "@angular-builders/jest": "^9.0.0", "@angular-devkit/build-ng-packagr": "~0.1000.0", "@angular/cli": "~10.0.0", "@angular/common": "~10.0.0", @@ -32,26 +32,26 @@ "@angular/core": "~10.0.0", "@angular/platform-browser": "~10.0.0", "@angular/platform-browser-dynamic": "~10.0.0", - "@types/execa": "~2.0.0", - "@types/fs-extra": "~8.1.0", - "@types/jest": "~25.1.4", - "@types/node": "~12.11.1", - "codelyzer": "~5.1.2", - "execa": "~4.0.0", - "fs-extra": "~9.0.0", - "jest": "~25.2.4", - "jest-preset-angular": "~8.1.2", - "ng-packagr": "~10.0.0", - "protractor": "~7.0.0", + "@types/execa": "^2.0.0", + "@types/fs-extra": "^8.1.0", + "@types/jest": "^25.1.4", + "@types/node": "^12.11.1", + "codelyzer": "^5.1.2", + "execa": "^4.0.0", + "fs-extra": "^9.0.0", + "jest": "^25.2.4", + "jest-preset-angular": "^8.1.2", + "ng-packagr": "^10.0.0", + "protractor": "^7.0.0", "ts-node": "~8.3.0", "tslib": "~2.0.0", - "tslint": "~6.1.0", + "tslint": "^6.1.0", "typescript": "~3.9.5", "zone.js": "~0.10.2" }, "peerDependencies": {}, "dependencies": { - "just-compare": "~1.3.0" + "just-compare": "^1.3.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } From c1fd463ad9da024351d0f974b9528777c6c87820 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 29 Jun 2020 13:21:02 +0300 Subject: [PATCH 131/190] ci: add replace with tilde script for mvc packs --- npm/package.json | 3 ++- npm/preview-publish.ps1 | 4 +++- npm/publish.ps1 | 4 +++- npm/replace-with-tilde.js | 28 ++++++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 npm/replace-with-tilde.js diff --git a/npm/package.json b/npm/package.json index c0662c6ebb..70496aba97 100644 --- a/npm/package.json +++ b/npm/package.json @@ -5,7 +5,8 @@ "gulp:app": "node run-gulp-script.js ../templates/app/aspnet-core", "gulp:module": "node run-gulp-script.js ../templates/module/aspnet-core", "ncu": "ncu", - "update:templates": "node abp-package-update-script.js ../templates" + "update:templates": "node abp-package-update-script.js ../templates", + "replace-with-tilde": "node replace-with-tilde.js" }, "devDependencies": { "@types/fs-extra": "^8.0.1", diff --git a/npm/preview-publish.ps1 b/npm/preview-publish.ps1 index ea4afd44d6..11c4ca0a21 100644 --- a/npm/preview-publish.ps1 +++ b/npm/preview-publish.ps1 @@ -24,7 +24,9 @@ $commands = ( "npm install", "npm run publish-packages -- --nextVersion $Version --preview", "cd ../../", - "yarn lerna publish $Version --no-push --yes --no-git-reset --no-commit-hooks --no-git-tag-version --force-publish --dist-tag preview --registry $Registry" + "yarn lerna version $Version --yes --no-commit-hooks --skip-git --force-publish", + "yarn replace-with-tilde", + "yarn lerna exec 'npm publish --registry $Registry --tag preview'" ) foreach ($command in $commands) { diff --git a/npm/publish.ps1 b/npm/publish.ps1 index a510527401..aaed04e6d4 100644 --- a/npm/publish.ps1 +++ b/npm/publish.ps1 @@ -16,7 +16,9 @@ $commands = ( "npm install", "npm run publish-packages -- --nextVersion $Version", "cd ../../", - "yarn lerna publish $Version --no-push --yes --no-git-reset --no-commit-hooks --no-git-tag-version --force-publish", + "yarn lerna version $Version --yes --no-commit-hooks --skip-git --force-publish", + "yarn replace-with-tilde", + "yarn lerna exec 'npm publish --registry https://registry.npmjs.org'", "yarn update:templates", "yarn gulp:app", "yarn gulp:module" diff --git a/npm/replace-with-tilde.js b/npm/replace-with-tilde.js new file mode 100644 index 0000000000..34438f4f5f --- /dev/null +++ b/npm/replace-with-tilde.js @@ -0,0 +1,28 @@ +const glob = require('glob'); +const fse = require('fs-extra'); + +function replace(filePath) { + const pkg = fse.readJsonSync(filePath); + + const { dependencies } = pkg; + + if (!dependencies) return; + + Object.keys(dependencies).forEach((key) => { + if (key.includes('@abp/') && key !== '@abp/utils') { + dependencies[key] = dependencies[key].replace('^', '~'); + } + }); + + fse.writeJsonSync(filePath, { ...pkg, dependencies }, { spaces: 2 }); +} + +glob('./packs/**/package.json', {}, (er, files) => { + files.forEach((path) => { + if (path.includes('node_modules')) { + return; + } + + replace(path); + }); +}); From 40863bc408cd102876faebf0467a0a69822df2d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87otur?= Date: Mon, 29 Jun 2020 13:34:56 +0300 Subject: [PATCH 132/190] Update DynamicMaxLengthAttributeAdapter.cs --- .../DataAnnotations/DynamicMaxLengthAttributeAdapter.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicMaxLengthAttributeAdapter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicMaxLengthAttributeAdapter.cs index ca3b3ce7ab..9791534aac 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicMaxLengthAttributeAdapter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicMaxLengthAttributeAdapter.cs @@ -33,12 +33,13 @@ namespace Volo.Abp.AspNetCore.Mvc.DataAnnotations { Check.NotNull(context, nameof(context)); - MergeAttribute(context.Attributes, "data-val", "true"); - MergeAttribute(context.Attributes, "data-val-length", GetErrorMessage(context)); + MergeAttribute(context.Attributes, "data-val", "true"); + MergeAttribute(context.Attributes, "data-val-maxlength", GetErrorMessage(context)); + MergeAttribute(context.Attributes, "data-val-maxlength-max", _max); if (Attribute.Length != int.MaxValue) { - MergeAttribute(context.Attributes, "data-val-length-max", _max); + MergeAttribute(context.Attributes, "data-val-maxlength-max", _max); } } } From 2d4f89bddfbd26e6c8ef4236b00632c504192297 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87otur?= Date: Mon, 29 Jun 2020 13:35:12 +0300 Subject: [PATCH 133/190] Update DynamicMaxLengthAttributeAdapter.cs --- .../DynamicMaxLengthAttributeAdapter.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicMaxLengthAttributeAdapter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicMaxLengthAttributeAdapter.cs index 9791534aac..f8193a2e79 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicMaxLengthAttributeAdapter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicMaxLengthAttributeAdapter.cs @@ -9,9 +9,9 @@ namespace Volo.Abp.AspNetCore.Mvc.DataAnnotations public class DynamicMaxLengthAttributeAdapter : AttributeAdapterBase { private readonly string _max; - + public DynamicMaxLengthAttributeAdapter( - DynamicMaxLengthAttribute attribute, + DynamicMaxLengthAttribute attribute, IStringLocalizer stringLocalizer) : base(attribute, stringLocalizer) { @@ -33,9 +33,9 @@ namespace Volo.Abp.AspNetCore.Mvc.DataAnnotations { Check.NotNull(context, nameof(context)); - MergeAttribute(context.Attributes, "data-val", "true"); - MergeAttribute(context.Attributes, "data-val-maxlength", GetErrorMessage(context)); - MergeAttribute(context.Attributes, "data-val-maxlength-max", _max); + MergeAttribute(context.Attributes, "data-val", "true"); + MergeAttribute(context.Attributes, "data-val-maxlength", GetErrorMessage(context)); + MergeAttribute(context.Attributes, "data-val-maxlength-max", _max); if (Attribute.Length != int.MaxValue) { From 5c28936eaab88f40cbe0388adc2be9ae14fbabed Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 29 Jun 2020 14:38:15 +0300 Subject: [PATCH 134/190] feat: add roles property to CurrentUser interface resolves #4517 --- .../core/src/lib/models/application-configuration.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/models/application-configuration.ts b/npm/ng-packs/packages/core/src/lib/models/application-configuration.ts index b52afe9faf..1f3bb65f4e 100644 --- a/npm/ng-packs/packages/core/src/lib/models/application-configuration.ts +++ b/npm/ng-packs/packages/core/src/lib/models/application-configuration.ts @@ -62,10 +62,11 @@ export namespace ApplicationConfiguration { } export interface CurrentUser { - isAuthenticated: boolean; + email: string; id: string; + isAuthenticated: boolean; + roles: string[]; tenantId: string; userName: string; - email: string; } } From 91b2f844e086118cc903004df96d2863a2a06116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87otur?= Date: Mon, 29 Jun 2020 14:41:23 +0300 Subject: [PATCH 135/190] AuditLog Module const converted to static --- .../Abp/AuditLogging/AuditLogActionConsts.cs | 6 ++--- .../Volo/Abp/AuditLogging/AuditLogConsts.cs | 24 +++++++++---------- .../Abp/AuditLogging/EntityChangeConsts.cs | 4 ++-- .../EntityPropertyChangeConsts.cs | 8 +++---- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AuditLogActionConsts.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AuditLogActionConsts.cs index 86652aacec..d40ad03c94 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AuditLogActionConsts.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AuditLogActionConsts.cs @@ -2,10 +2,10 @@ { public class AuditLogActionConsts { - public const int MaxServiceNameLength = 256; + public static int MaxServiceNameLength { get; set; } = 256; - public const int MaxMethodNameLength = 128; + public static int MaxMethodNameLength { get; set; } = 128; - public const int MaxParametersLength = 2000; + public static int MaxParametersLength { get; set; } = 2000; } } diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AuditLogConsts.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AuditLogConsts.cs index 504e7451e0..3a5e220301 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AuditLogConsts.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AuditLogConsts.cs @@ -2,31 +2,31 @@ { public static class AuditLogConsts { - public const int MaxApplicationNameLength = 96; + public static int MaxApplicationNameLength { get; set; } = 96; - public const int MaxClientIpAddressLength = 64; + public static int MaxClientIpAddressLength { get; set; } = 64; - public const int MaxClientNameLength = 128; + public static int MaxClientNameLength { get; set; } = 128; - public const int MaxClientIdLength = 64; + public static int MaxClientIdLength { get; set; } = 64; - public const int MaxCorrelationIdLength = 64; + public static int MaxCorrelationIdLength { get; set; } = 64; - public const int MaxBrowserInfoLength = 512; + public static int MaxBrowserInfoLength { get; set; } = 512; - public const int MaxExceptionsLength = 4000; + public static int MaxExceptionsLength { get; set; } = 4000; //TODO: Replace with MaxExceptionsLength in v3.0 public static int MaxExceptionsLengthValue { get; set; } = MaxExceptionsLength; - public const int MaxCommentsLength = 256; + public static int MaxCommentsLength { get; set; } = 256; - public const int MaxUrlLength = 256; + public static int MaxUrlLength { get; set; } = 256; - public const int MaxHttpMethodLength = 16; + public static int MaxHttpMethodLength { get; set; } = 16; - public const int MaxUserNameLength = 256; + public static int MaxUserNameLength { get; set; } = 256; - public const int MaxTenantNameLength = 64; + public static int MaxTenantNameLength { get; set; } = 64; } } diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityChangeConsts.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityChangeConsts.cs index d19407cfa4..22236ac437 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityChangeConsts.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityChangeConsts.cs @@ -2,8 +2,8 @@ { public class EntityChangeConsts { - public const int MaxEntityTypeFullNameLength = 128; + public static int MaxEntityTypeFullNameLength { get; set; } = 128; - public const int MaxEntityIdLength = 128; + public static int MaxEntityIdLength { get; set; } = 128; } } diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityPropertyChangeConsts.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityPropertyChangeConsts.cs index 2ac9204395..73fce2bd1f 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityPropertyChangeConsts.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityPropertyChangeConsts.cs @@ -2,12 +2,12 @@ { public class EntityPropertyChangeConsts { - public const int MaxNewValueLength = 512; + public static int MaxNewValueLength { get; set; } = 512; - public const int MaxOriginalValueLength = 512; + public static int MaxOriginalValueLength { get; set; } = 512; - public const int MaxPropertyNameLength = 128; + public static int MaxPropertyNameLength { get; set; } = 128; - public const int MaxPropertyTypeFullNameLength = 64; + public static int MaxPropertyTypeFullNameLength { get; set; } = 64; } } From bc9bed8b61a1b2bb8a91e84b6e26a45a31502cca Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 29 Jun 2020 14:41:50 +0300 Subject: [PATCH 136/190] chore: remove a duplication from theme-shared.module --- .../apps/dev-app/src/app/home/home-routing.module.ts | 7 +------ .../packages/theme-shared/src/lib/theme-shared.module.ts | 7 ++----- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/npm/ng-packs/apps/dev-app/src/app/home/home-routing.module.ts b/npm/ng-packs/apps/dev-app/src/app/home/home-routing.module.ts index 634706a36c..7089990134 100644 --- a/npm/ng-packs/apps/dev-app/src/app/home/home-routing.module.ts +++ b/npm/ng-packs/apps/dev-app/src/app/home/home-routing.module.ts @@ -2,12 +2,7 @@ import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; import { HomeComponent } from './home.component'; -const routes: Routes = [ - { - path: '', - children: [{ path: '', component: HomeComponent }], - }, -]; +const routes: Routes = [{ path: '', component: HomeComponent }]; @NgModule({ imports: [RouterModule.forChild(routes)], diff --git a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts index 18f7e2007d..e45ac8d1e3 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts @@ -1,10 +1,9 @@ -import { ConfigState, CoreModule, noop } from '@abp/ng.core'; +import { CoreModule, noop } from '@abp/ng.core'; import { DatePipe } from '@angular/common'; import { APP_INITIALIZER, Injector, ModuleWithProviders, NgModule } from '@angular/core'; import { NgbDateParserFormatter, NgbPaginationModule } from '@ng-bootstrap/ng-bootstrap'; import { NgxValidateCoreModule } from '@ngx-validate/core'; -import { Store } from '@ngxs/store'; -import { INgxDatatableConfig, NgxDatatableModule } from '@swimlane/ngx-datatable'; +import { NgxDatatableModule } from '@swimlane/ngx-datatable'; import { BreadcrumbComponent } from './components/breadcrumb/breadcrumb.component'; import { ButtonComponent } from './components/button/button.component'; import { ChartComponent } from './components/chart/chart.component'; @@ -52,7 +51,6 @@ import { DateParserFormatter } from './utils/date-parser-formatter'; NgxDatatableListDirective, LoadingDirective, TableSortDirective, - ToastContainerComponent, ], exports: [ NgxDatatableModule, @@ -72,7 +70,6 @@ import { DateParserFormatter } from './utils/date-parser-formatter'; NgxDatatableListDirective, LoadingDirective, TableSortDirective, - ToastContainerComponent, ], providers: [DatePipe], entryComponents: [ From a18482bb489521733e4ae15691439302e7fcebb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87otur?= Date: Mon, 29 Jun 2020 14:47:39 +0300 Subject: [PATCH 137/190] BackgroundJobs module const converted to static --- .../Volo/Abp/BackgroundJobs/BackgroundJobRecordConsts.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo/Abp/BackgroundJobs/BackgroundJobRecordConsts.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo/Abp/BackgroundJobs/BackgroundJobRecordConsts.cs index f4418bc423..ac4b98230a 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo/Abp/BackgroundJobs/BackgroundJobRecordConsts.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo/Abp/BackgroundJobs/BackgroundJobRecordConsts.cs @@ -2,8 +2,8 @@ { public static class BackgroundJobRecordConsts { - public const int MaxJobNameLength = 128; + public static int MaxJobNameLength { get; set; } = 128; - public const int MaxJobArgsLength = 1024 * 1024; + public static int MaxJobArgsLength { get; set; } = 1024 * 1024; } } From 59054a16c4b6b7f2fa14f20dbff0ff7899b173ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87otur?= Date: Mon, 29 Jun 2020 14:50:32 +0300 Subject: [PATCH 138/190] BlobStoringDatabase module consts converted to static --- .../Volo/Abp/BlobStoring/Database/DatabaseContainerConsts.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo/Abp/BlobStoring/Database/DatabaseContainerConsts.cs b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo/Abp/BlobStoring/Database/DatabaseContainerConsts.cs index 0a71451f9f..22d127a1f1 100644 --- a/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo/Abp/BlobStoring/Database/DatabaseContainerConsts.cs +++ b/modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo/Abp/BlobStoring/Database/DatabaseContainerConsts.cs @@ -2,6 +2,9 @@ { public static class DatabaseContainerConsts { - public const int MaxNameLength = 128; + /// + /// Default value: 128. + /// + public static int MaxNameLength { get; set; } = 128; } } \ No newline at end of file From f7d8a96c438fd00385549200dd146d74b5046022 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87otur?= Date: Mon, 29 Jun 2020 15:03:20 +0300 Subject: [PATCH 139/190] Blog module consts converted to static --- .../Blogging/Admin/Blogs/Create.cshtml.cs | 7 +++-- .../Pages/Blogging/Admin/Blogs/Edit.cshtml.cs | 7 +++-- .../Volo/Blogging/Files/BloggingWebConsts.cs | 5 +++- .../Volo/Blogging/Posts/CreatePostDto.cs | 9 +++--- .../Volo/Blogging/Blogs/BlogConsts.cs | 15 ++++++++-- .../Volo/Blogging/Comments/CommentConsts.cs | 5 +++- .../Volo/Blogging/Posts/PostConsts.cs | 30 +++++++++++++++---- .../Volo/Blogging/Tagging/TagConsts.cs | 10 +++++-- .../Pages/Blogs/Posts/Edit.cshtml.cs | 9 +++--- .../Pages/Blogs/Posts/New.cshtml.cs | 9 +++--- 10 files changed, 75 insertions(+), 31 deletions(-) diff --git a/modules/blogging/src/Volo.Blogging.Admin.Web/Pages/Blogging/Admin/Blogs/Create.cshtml.cs b/modules/blogging/src/Volo.Blogging.Admin.Web/Pages/Blogging/Admin/Blogs/Create.cshtml.cs index b2d89fbd55..6f4bae5e63 100644 --- a/modules/blogging/src/Volo.Blogging.Admin.Web/Pages/Blogging/Admin/Blogs/Create.cshtml.cs +++ b/modules/blogging/src/Volo.Blogging.Admin.Web/Pages/Blogging/Admin/Blogs/Create.cshtml.cs @@ -2,6 +2,7 @@ using System.ComponentModel.DataAnnotations; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Volo.Abp.Validation; using Volo.Blogging.Admin.Blogs; using Volo.Blogging.Blogs; @@ -44,14 +45,14 @@ namespace Volo.Blogging.Admin.Pages.Blogging.Admin.Blogs public class BlogCreateModalView { [Required] - [StringLength(BlogConsts.MaxNameLength)] + [DynamicStringLength(typeof(BlogConsts), nameof(BlogConsts.MaxNameLength))] public string Name { get; set; } [Required] - [StringLength(BlogConsts.MaxShortNameLength)] + [DynamicStringLength(typeof(BlogConsts), nameof(BlogConsts.MaxShortNameLength))] public string ShortName { get; set; } - [StringLength(BlogConsts.MaxDescriptionLength)] + [DynamicStringLength(typeof(BlogConsts), nameof(BlogConsts.MaxDescriptionLength))] public string Description { get; set; } } diff --git a/modules/blogging/src/Volo.Blogging.Admin.Web/Pages/Blogging/Admin/Blogs/Edit.cshtml.cs b/modules/blogging/src/Volo.Blogging.Admin.Web/Pages/Blogging/Admin/Blogs/Edit.cshtml.cs index 536810e015..8d0b2ba978 100644 --- a/modules/blogging/src/Volo.Blogging.Admin.Web/Pages/Blogging/Admin/Blogs/Edit.cshtml.cs +++ b/modules/blogging/src/Volo.Blogging.Admin.Web/Pages/Blogging/Admin/Blogs/Edit.cshtml.cs @@ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Volo.Abp.Validation; using Volo.Blogging.Admin.Blogs; using Volo.Blogging.Blogs; @@ -58,14 +59,14 @@ namespace Volo.Blogging.Admin.Pages.Blogging.Admin.Blogs public Guid Id { get; set; } [Required] - [StringLength(BlogConsts.MaxNameLength)] + [DynamicStringLength(typeof(BlogConsts), nameof(BlogConsts.MaxNameLength))] public string Name { get; set; } [Required] - [StringLength(BlogConsts.MaxShortNameLength)] + [DynamicStringLength(typeof(BlogConsts), nameof(BlogConsts.MaxShortNameLength))] public string ShortName { get; set; } - [StringLength(BlogConsts.MaxDescriptionLength)] + [DynamicStringLength(typeof(BlogConsts), nameof(BlogConsts.MaxDescriptionLength))] public string Description { get; set; } } } diff --git a/modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/Files/BloggingWebConsts.cs b/modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/Files/BloggingWebConsts.cs index ae4eb32dff..d9eb284ac6 100644 --- a/modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/Files/BloggingWebConsts.cs +++ b/modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/Files/BloggingWebConsts.cs @@ -6,7 +6,10 @@ namespace Volo.Blogging { public class FileUploading { - public const int MaxFileSize = 5242880; //5MB + /// + /// Default value: 5242880 + /// + public static int MaxFileSize { get; set; } = 5242880; //5MB public static int MaxFileSizeAsMegabytes => Convert.ToInt32((MaxFileSize / 1024f) / 1024f); } diff --git a/modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/Posts/CreatePostDto.cs b/modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/Posts/CreatePostDto.cs index 164e4f691f..96cfbd6859 100644 --- a/modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/Posts/CreatePostDto.cs +++ b/modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/Posts/CreatePostDto.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel.DataAnnotations; +using Volo.Abp.Validation; namespace Volo.Blogging.Posts { @@ -8,22 +9,22 @@ namespace Volo.Blogging.Posts public Guid BlogId { get; set; } [Required] - [StringLength(PostConsts.MaxTitleLength)] + [DynamicStringLength(typeof(PostConsts), nameof(PostConsts.MaxTitleLength))] public string Title { get; set; } [Required] public string CoverImage { get; set; } [Required] - [StringLength(PostConsts.MaxUrlLength)] + [DynamicStringLength(typeof(PostConsts), nameof(PostConsts.MaxUrlLength))] public string Url { get; set; } - [StringLength(PostConsts.MaxContentLength)] + [DynamicStringLength(typeof(PostConsts), nameof(PostConsts.MaxContentLength))] public string Content { get; set; } public string Tags { get; set; } - [StringLength(PostConsts.MaxDescriptionLength)] + [DynamicStringLength(typeof(PostConsts), nameof(PostConsts.MaxDescriptionLength))] public string Description { get; set; } } diff --git a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Blogs/BlogConsts.cs b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Blogs/BlogConsts.cs index 502a4364e7..b4b428207c 100644 --- a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Blogs/BlogConsts.cs +++ b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Blogs/BlogConsts.cs @@ -2,10 +2,19 @@ { public static class BlogConsts { - public const int MaxNameLength = 256; + /// + /// Default value: 256 + /// + public static int MaxNameLength { get; set; } = 256; - public const int MaxShortNameLength = 32; + /// + /// Default value: 32 + /// + public static int MaxShortNameLength { get; set; } = 32; - public const int MaxDescriptionLength = 1024; + /// + /// Default value: 1024 + /// + public static int MaxDescriptionLength { get; set; } = 1024; } } diff --git a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Comments/CommentConsts.cs b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Comments/CommentConsts.cs index 34cc655fb3..359b322cbf 100644 --- a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Comments/CommentConsts.cs +++ b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Comments/CommentConsts.cs @@ -2,6 +2,9 @@ { public class CommentConsts { - public const int MaxTextLength = 1024; + /// + /// Default value: 1024 + /// + public static int MaxTextLength { get; set; } = 1024; } } diff --git a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Posts/PostConsts.cs b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Posts/PostConsts.cs index 665984dfbb..de91caa2d3 100644 --- a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Posts/PostConsts.cs +++ b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Posts/PostConsts.cs @@ -2,16 +2,34 @@ { public static class PostConsts { - public const int MaxTitleLength = 512; + /// + /// Default value: 512 + /// + public static int MaxTitleLength { get; set; } = 512; - public const int MaxUrlLength = 64; + /// + /// Default value: 64 + /// + public static int MaxUrlLength { get; set; } = 64; - public const int MaxContentLength = 1024 * 1024; //1MB + /// + /// Default value: 1024 * 1024 + /// + public static int MaxContentLength { get; set; } = 1024 * 1024; //1MB - public const int MaxDescriptionLength = 1000; + /// + /// Default value: 1000 + /// + public static int MaxDescriptionLength { get; set; } = 1000; - public const int MaxTitleLengthToBeSeoFriendly = 60; + /// + /// Default value: 60 + /// + public static int MaxTitleLengthToBeSeoFriendly { get; set; } = 60; - public const int MaxSeoFriendlyDescriptionLength = 200; + /// + /// Default value: 200 + /// + public static int MaxSeoFriendlyDescriptionLength { get; set; } = 200; } } diff --git a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Tagging/TagConsts.cs b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Tagging/TagConsts.cs index c75ccd4184..ad2be87ca8 100644 --- a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Tagging/TagConsts.cs +++ b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Tagging/TagConsts.cs @@ -2,8 +2,14 @@ { public class TagConsts { - public const int MaxNameLength = 64; + /// + /// Default value: 64 + /// + public static int MaxNameLength { get; set; } = 64; - public const int MaxDescriptionLength = 512; + /// + /// Default value: 512 + /// + public static int MaxDescriptionLength { get; set; } = 512; } } diff --git a/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Edit.cshtml.cs b/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Edit.cshtml.cs index c2ebcc441b..6d998a7172 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Edit.cshtml.cs +++ b/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Edit.cshtml.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; +using Volo.Abp.Validation; using Volo.Blogging.Blogs; using Volo.Blogging.Pages.Blogs.Shared.Helpers; using Volo.Blogging.Posts; @@ -85,7 +86,7 @@ namespace Volo.Blogging.Pages.Blog.Posts public Guid BlogId { get; set; } [Required] - [StringLength(PostConsts.MaxTitleLength)] + [DynamicStringLength(typeof(PostConsts), nameof(PostConsts.MaxTitleLength))] public string Title { get; set; } [Required] @@ -93,14 +94,14 @@ namespace Volo.Blogging.Pages.Blog.Posts public string CoverImage { get; set; } [Required] - [StringLength(PostConsts.MaxUrlLength)] + [DynamicStringLength(typeof(PostConsts), nameof(PostConsts.MaxUrlLength))] public string Url { get; set; } [HiddenInput] - [StringLength(PostConsts.MaxContentLength)] + [DynamicStringLength(typeof(PostConsts), nameof(PostConsts.MaxContentLength))] public string Content { get; set; } - [StringLength(PostConsts.MaxDescriptionLength)] + [DynamicStringLength(typeof(PostConsts), nameof(PostConsts.MaxDescriptionLength))] public string Description { get; set; } public string Tags { get; set; } diff --git a/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/New.cshtml.cs b/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/New.cshtml.cs index 41c8f43ddd..3930a79900 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/New.cshtml.cs +++ b/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/New.cshtml.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; +using Volo.Abp.Validation; using Volo.Blogging.Blogs; using Volo.Blogging.Blogs.Dtos; using Volo.Blogging.Pages.Blogs.Shared.Helpers; @@ -79,7 +80,7 @@ namespace Volo.Blogging.Pages.Blog.Posts public Guid BlogId { get; set; } [Required] - [StringLength(PostConsts.MaxTitleLength)] + [DynamicStringLength(typeof(PostConsts), nameof(PostConsts.MaxTitleLength))] public string Title { get; set; } [Required] @@ -87,16 +88,16 @@ namespace Volo.Blogging.Pages.Blog.Posts public string CoverImage { get; set; } [Required] - [StringLength(PostConsts.MaxUrlLength)] + [DynamicStringLength(typeof(PostConsts), nameof(PostConsts.MaxUrlLength))] public string Url { get; set; } [HiddenInput] - [StringLength(PostConsts.MaxContentLength)] + [DynamicStringLength(typeof(PostConsts), nameof(PostConsts.MaxContentLength))] public string Content { get; set; } public string Tags { get; set; } - [StringLength(PostConsts.MaxDescriptionLength)] + [DynamicStringLength(typeof(PostConsts), nameof(PostConsts.MaxDescriptionLength))] public string Description { get; set; } } From 90958e56ec0670f72bab4c6f364cb90c117fba4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87otur?= Date: Mon, 29 Jun 2020 15:04:28 +0300 Subject: [PATCH 140/190] Update BackgroundJobRecordConsts.cs --- .../Volo/Abp/BackgroundJobs/BackgroundJobRecordConsts.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo/Abp/BackgroundJobs/BackgroundJobRecordConsts.cs b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo/Abp/BackgroundJobs/BackgroundJobRecordConsts.cs index ac4b98230a..01f935b30e 100644 --- a/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo/Abp/BackgroundJobs/BackgroundJobRecordConsts.cs +++ b/modules/background-jobs/src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo/Abp/BackgroundJobs/BackgroundJobRecordConsts.cs @@ -2,8 +2,14 @@ { public static class BackgroundJobRecordConsts { + /// + /// Default value: 128 + /// public static int MaxJobNameLength { get; set; } = 128; + /// + /// Default value: 1024 * 1024 + /// public static int MaxJobArgsLength { get; set; } = 1024 * 1024; } } From 238b3930093532c772fb92d630b1b7ba1cb4e0e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87otur?= Date: Mon, 29 Jun 2020 15:07:13 +0300 Subject: [PATCH 141/190] Added summaries to audit logging consts --- .../Abp/AuditLogging/AuditLogActionConsts.cs | 9 +++++ .../Volo/Abp/AuditLogging/AuditLogConsts.cs | 36 +++++++++++++++++++ .../Abp/AuditLogging/EntityChangeConsts.cs | 6 ++++ .../EntityPropertyChangeConsts.cs | 12 +++++++ 4 files changed, 63 insertions(+) diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AuditLogActionConsts.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AuditLogActionConsts.cs index d40ad03c94..5f1967804e 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AuditLogActionConsts.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AuditLogActionConsts.cs @@ -2,10 +2,19 @@ { public class AuditLogActionConsts { + /// + /// Default value: 256 + /// public static int MaxServiceNameLength { get; set; } = 256; + /// + /// Default value: 128 + /// public static int MaxMethodNameLength { get; set; } = 128; + /// + /// Default value: 2000 + /// public static int MaxParametersLength { get; set; } = 2000; } } diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AuditLogConsts.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AuditLogConsts.cs index 3a5e220301..4a8c723b76 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AuditLogConsts.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/AuditLogConsts.cs @@ -2,31 +2,67 @@ { public static class AuditLogConsts { + /// + /// Default value: 96 + /// public static int MaxApplicationNameLength { get; set; } = 96; + /// + /// Default value: 64 + /// public static int MaxClientIpAddressLength { get; set; } = 64; + /// + /// Default value: 128 + /// public static int MaxClientNameLength { get; set; } = 128; + /// + /// Default value: 64 + /// public static int MaxClientIdLength { get; set; } = 64; + /// + /// Default value: 64 + /// public static int MaxCorrelationIdLength { get; set; } = 64; + /// + /// Default value: 512 + /// public static int MaxBrowserInfoLength { get; set; } = 512; + /// + /// Default value: 4000 + /// public static int MaxExceptionsLength { get; set; } = 4000; //TODO: Replace with MaxExceptionsLength in v3.0 public static int MaxExceptionsLengthValue { get; set; } = MaxExceptionsLength; + /// + /// Default value: 256 + /// public static int MaxCommentsLength { get; set; } = 256; + /// + /// Default value: 256 + /// public static int MaxUrlLength { get; set; } = 256; + /// + /// Default value: 16 + /// public static int MaxHttpMethodLength { get; set; } = 16; + /// + /// Default value: 256 + /// public static int MaxUserNameLength { get; set; } = 256; + /// + /// Default value: 64 + /// public static int MaxTenantNameLength { get; set; } = 64; } } diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityChangeConsts.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityChangeConsts.cs index 22236ac437..b7f88db3e2 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityChangeConsts.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityChangeConsts.cs @@ -2,8 +2,14 @@ { public class EntityChangeConsts { + /// + /// Default value: 128 + /// public static int MaxEntityTypeFullNameLength { get; set; } = 128; + /// + /// Default value: 128 + /// public static int MaxEntityIdLength { get; set; } = 128; } } diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityPropertyChangeConsts.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityPropertyChangeConsts.cs index 73fce2bd1f..8d592e06aa 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityPropertyChangeConsts.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/EntityPropertyChangeConsts.cs @@ -2,12 +2,24 @@ { public class EntityPropertyChangeConsts { + /// + /// Default value: 512 + /// public static int MaxNewValueLength { get; set; } = 512; + /// + /// Default value: 512 + /// public static int MaxOriginalValueLength { get; set; } = 512; + /// + /// Default value: 128 + /// public static int MaxPropertyNameLength { get; set; } = 128; + /// + /// Default value: 64 + /// public static int MaxPropertyTypeFullNameLength { get; set; } = 64; } } From 78c6b051a8587aba6b0f5b875f71f62f151fbb8d Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Mon, 29 Jun 2020 15:19:56 +0300 Subject: [PATCH 142/190] docs: update ListService.md according to ngx-datatable --- docs/en/UI/Angular/List-Service.md | 83 +++++++++++++----------------- 1 file changed, 37 insertions(+), 46 deletions(-) diff --git a/docs/en/UI/Angular/List-Service.md b/docs/en/UI/Angular/List-Service.md index b3c8571866..b42d11d4a5 100644 --- a/docs/en/UI/Angular/List-Service.md +++ b/docs/en/UI/Angular/List-Service.md @@ -53,43 +53,22 @@ class BookComponent { } ``` -> Noticed `list` is `public` and `readonly`? That is because we will use `ListService` properties directly in the component's template. That may be considered as an anti-pattern, but it is much quicker to implement. You can always use public component properties instead. +> Noticed `list` is `public` and `readonly`? That is because we will use `ListService` directly in the component's template. That may be considered as an anti-pattern, but it is much quicker to implement. You can always use public component members to expose the `ListService` instance instead. -Place `ListService` properties into the template like this: +Bind `ListService` to ngx-datatable like this: ```html - - - - - - - {%{{{ '::Name' | abpLocalization }}}%} - - - - - - - - {%{{{ data.name }}}%} - - + + ``` + ## Usage with Observables You may use observables in combination with [AsyncPipe](https://angular.io/guide/observables-in-angular#async-pipe) of Angular instead. Here are some possibilities: @@ -101,11 +80,14 @@ You may use observables in combination with [AsyncPipe](https://angular.io/guide ```html - - + + ``` @@ -128,32 +110,41 @@ You may use observables in combination with [AsyncPipe](https://angular.io/guide ```html - - + + ``` +> We donot recommend using NGXS store for CRUD pages, unless your application needs to share list information between components or use it later on in another page. + + ## How to Refresh Table on Create/Update/Delete `ListService` exposes a `get` method to trigger a request with the current query. So, basically, whenever a create, update, or delete action resolves, you can call `this.list.get();` and it will call hooked stream creator again. ```ts -this.store.dispatch(new DeleteBook(id)).subscribe(this.list.get); + this.bookService.createByInput(form.value) + .subscribe(() => { + this.list.get(); + + // Other subscription logic here + }); ``` ...or... ```ts -this.bookService.createByInput(form.value) - .subscribe(() => { - this.list.get(); - - // Other subscription logic here - }) + this.store.dispatch(new DeleteBook(id)).subscribe(this.list.get); ``` +> We donot recommend using NGXS store for CRUD pages, unless your application needs to share list information between components or use it later on in another page. + + ## How to Implement Server-Side Search in a Table `ListService` exposes a `filter` property that will trigger a request with the current query and the given search string. All you need to do is to bind it to an input element with two-way binding. From 1502f14496e272f845cc2816268e24e9a55adf04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87otur?= Date: Mon, 29 Jun 2020 15:24:12 +0300 Subject: [PATCH 143/190] Blog module consts converted to static --- .../Volo/Docs/Admin/Documents/GetAllInput.cs | 11 ++-- .../Admin/Documents/PullAllDocumentInput.cs | 5 +- .../Docs/Admin/Documents/PullDocumentInput.cs | 7 +-- .../Docs/Admin/Projects/Create.cshtml.cs | 15 +++--- .../Pages/Docs/Admin/Projects/Edit.cshtml.cs | 13 ++--- .../Pages/Docs/Admin/Projects/Pull.cshtml.cs | 7 +-- .../Docs/Documents/GetDefaultDocumentInput.cs | 6 ++- .../Volo/Docs/Documents/GetDocumentInput.cs | 7 +-- .../Documents/GetDocumentResourceInput.cs | 7 +-- .../Documents/GetNavigationDocumentInput.cs | 5 +- .../Documents/GetParametersDocumentInput.cs | 5 +- .../Volo/Docs/Documents/DocumentConsts.cs | 53 +++++++++++++++---- .../Volo/Docs/Language/LanguageConsts.cs | 5 +- .../Volo/Docs/Projects/ProjectConsts.cs | 41 +++++++++++--- 14 files changed, 132 insertions(+), 55 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/GetAllInput.cs b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/GetAllInput.cs index e375f6ba0b..1512c13da9 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/GetAllInput.cs +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/GetAllInput.cs @@ -1,6 +1,7 @@ using System; using System.ComponentModel.DataAnnotations; using Volo.Abp.Application.Dtos; +using Volo.Abp.Validation; using Volo.Docs.Documents; namespace Volo.Docs.Admin.Documents @@ -9,19 +10,19 @@ namespace Volo.Docs.Admin.Documents { public Guid? ProjectId { get; set; } - [StringLength(DocumentConsts.MaxNameLength)] + [DynamicStringLength(typeof(DocumentConsts), nameof(DocumentConsts.MaxNameLength))] public string Name { get; set; } - [StringLength(DocumentConsts.MaxVersionNameLength)] + [DynamicStringLength(typeof(DocumentConsts), nameof(DocumentConsts.MaxVersionNameLength))] public string Version { get; set; } - [StringLength(DocumentConsts.MaxLanguageCodeNameLength)] + [DynamicStringLength(typeof(DocumentConsts), nameof(DocumentConsts.MaxLanguageCodeNameLength))] public string LanguageCode { get; set; } - [StringLength(DocumentConsts.MaxFileNameNameLength)] + [DynamicStringLength(typeof(DocumentConsts), nameof(DocumentConsts.MaxFileNameNameLength))] public string FileName { get; set; } - [StringLength(DocumentConsts.MaxFormatNameLength)] + [DynamicStringLength(typeof(DocumentConsts), nameof(DocumentConsts.MaxFormatNameLength))] public string Format { get; set; } public DateTime? CreationTimeMin { get; set; } diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/PullAllDocumentInput.cs b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/PullAllDocumentInput.cs index d796c00e64..c375de8b67 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/PullAllDocumentInput.cs +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/PullAllDocumentInput.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel.DataAnnotations; +using Volo.Abp.Validation; using Volo.Docs.Documents; namespace Volo.Docs.Admin.Documents @@ -8,10 +9,10 @@ namespace Volo.Docs.Admin.Documents { public Guid ProjectId { get; set; } - [StringLength(DocumentConsts.MaxLanguageCodeNameLength)] + [DynamicStringLength(typeof(DocumentConsts), nameof(DocumentConsts.MaxLanguageCodeNameLength))] public string LanguageCode { get; set; } - [StringLength(DocumentConsts.MaxVersionNameLength)] + [DynamicStringLength(typeof(DocumentConsts), nameof(DocumentConsts.MaxVersionNameLength))] public string Version { get; set; } } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/PullDocumentInput.cs b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/PullDocumentInput.cs index fcc9816b02..dce5de0420 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/PullDocumentInput.cs +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/PullDocumentInput.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel.DataAnnotations; +using Volo.Abp.Validation; using Volo.Docs.Documents; namespace Volo.Docs.Admin.Documents @@ -8,13 +9,13 @@ namespace Volo.Docs.Admin.Documents { public Guid ProjectId { get; set; } - [StringLength(DocumentConsts.MaxNameLength)] + [DynamicStringLength(typeof(DocumentConsts), nameof(DocumentConsts.MaxNameLength))] public string Name { get; set; } - [StringLength(DocumentConsts.MaxLanguageCodeNameLength)] + [DynamicStringLength(typeof(DocumentConsts), nameof(DocumentConsts.MaxLanguageCodeNameLength))] public string LanguageCode { get; set; } - [StringLength(DocumentConsts.MaxVersionNameLength)] + [DynamicStringLength(typeof(DocumentConsts), nameof(DocumentConsts.MaxVersionNameLength))] public string Version { get; set; } } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Create.cshtml.cs b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Create.cshtml.cs index e6de68a3b1..506b674ba5 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Create.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Create.cshtml.cs @@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Mvc.Rendering; using Volo.Abp; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; +using Volo.Abp.Validation; using Volo.Docs.Admin.Projects; using Volo.Docs.Projects; @@ -70,11 +71,11 @@ namespace Volo.Docs.Admin.Pages.Docs.Admin.Projects public abstract class CreateProjectViewModelBase { [Required] - [StringLength(ProjectConsts.MaxNameLength)] + [DynamicStringLength(typeof(ProjectConsts), nameof(ProjectConsts.MaxNameLength))] public string Name { get; set; } [Required] - [StringLength(ProjectConsts.MaxShortNameLength)] + [DynamicStringLength(typeof(ProjectConsts), nameof(ProjectConsts.MaxShortNameLength))] [InputInfoText("ShortNameInfoText")] public string ShortName { get; set; } @@ -82,21 +83,21 @@ namespace Volo.Docs.Admin.Pages.Docs.Admin.Projects [SelectItems(nameof(FormatTypes))] public string Format { get; set; } - [StringLength(ProjectConsts.MaxDefaultDocumentNameLength)] + [DynamicStringLength(typeof(ProjectConsts), nameof(ProjectConsts.MaxDefaultDocumentNameLength))] public string DefaultDocumentName { get; set; } = "Index"; - [StringLength(ProjectConsts.MaxNavigationDocumentNameLength)] + [DynamicStringLength(typeof(ProjectConsts), nameof(ProjectConsts.MaxNavigationDocumentNameLength))] public string NavigationDocumentName { get; set; } = "docs-nav.json"; - [StringLength(ProjectConsts.MaxParametersDocumentNameLength)] + [DynamicStringLength(typeof(ProjectConsts), nameof(ProjectConsts.MaxParametersDocumentNameLength))] public string ParametersDocumentName { get; set; } = "docs-params.json"; - [StringLength(ProjectConsts.MaxVersionNameLength)] + [DynamicStringLength(typeof(ProjectConsts), nameof(ProjectConsts.MaxVersionNameLength))] public string MinimumVersion { get; set; } public string MainWebsiteUrl { get; set; } - [StringLength(ProjectConsts.MaxLatestVersionBranchNameLength)] + [DynamicStringLength(typeof(ProjectConsts), nameof(ProjectConsts.MaxLatestVersionBranchNameLength))] public string LatestVersionBranchName { get; set; } [HiddenInput] diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Edit.cshtml.cs b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Edit.cshtml.cs index 3b9aba5303..ef1762c460 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Edit.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Edit.cshtml.cs @@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Mvc.Rendering; using Volo.Abp; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; +using Volo.Abp.Validation; using Volo.Docs.Admin.Projects; using Volo.Docs.Projects; @@ -83,28 +84,28 @@ namespace Volo.Docs.Admin.Pages.Docs.Admin.Projects public Guid Id { get; set; } [Required] - [StringLength(ProjectConsts.MaxNameLength)] + [DynamicStringLength(typeof(ProjectConsts), nameof(ProjectConsts.MaxNameLength))] public string Name { get; set; } [Required] [SelectItems(nameof(FormatTypes))] public string Format { get; set; } - [StringLength(ProjectConsts.MaxDefaultDocumentNameLength)] + [DynamicStringLength(typeof(ProjectConsts), nameof(ProjectConsts.MaxDefaultDocumentNameLength))] public string DefaultDocumentName { get; set; } - [StringLength(ProjectConsts.MaxNavigationDocumentNameLength)] + [DynamicStringLength(typeof(ProjectConsts), nameof(ProjectConsts.MaxNavigationDocumentNameLength))] public string NavigationDocumentName { get; set; } - [StringLength(ProjectConsts.MaxParametersDocumentNameLength)] + [DynamicStringLength(typeof(ProjectConsts), nameof(ProjectConsts.MaxParametersDocumentNameLength))] public string ParametersDocumentName { get; set; } - [StringLength(ProjectConsts.MaxVersionNameLength)] + [DynamicStringLength(typeof(ProjectConsts), nameof(ProjectConsts.MaxVersionNameLength))] public string MinimumVersion { get; set; } public string MainWebsiteUrl { get; set; } - [StringLength(ProjectConsts.MaxLatestVersionBranchNameLength)] + [DynamicStringLength(typeof(ProjectConsts), nameof(ProjectConsts.MaxLatestVersionBranchNameLength))] public string LatestVersionBranchName { get; set; } } diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Pull.cshtml.cs b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Pull.cshtml.cs index 195337a22e..5cbd094834 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Pull.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Pull.cshtml.cs @@ -2,6 +2,7 @@ using System; using System.ComponentModel.DataAnnotations; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using Volo.Abp.Validation; using Volo.Docs.Admin.Documents; using Volo.Docs.Admin.Projects; using Volo.Docs.Documents; @@ -60,15 +61,15 @@ namespace Volo.Docs.Admin.Pages.Docs.Admin.Projects public bool All { get; set; } [Required] - [StringLength(DocumentConsts.MaxNameLength)] + [DynamicStringLength(typeof(DocumentConsts), nameof(DocumentConsts.MaxNameLength))] public string Name { get; set; } [Required] - [StringLength(DocumentConsts.MaxLanguageCodeNameLength)] + [DynamicStringLength(typeof(DocumentConsts),nameof(DocumentConsts.MaxLanguageCodeNameLength))] public string LanguageCode { get; set; } [Required] - [StringLength(DocumentConsts.MaxVersionNameLength)] + [DynamicStringLength(typeof(DocumentConsts), nameof(DocumentConsts.MaxVersionNameLength))] public string Version { get; set; } } } diff --git a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetDefaultDocumentInput.cs b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetDefaultDocumentInput.cs index 3deeb83967..1cef038512 100644 --- a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetDefaultDocumentInput.cs +++ b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetDefaultDocumentInput.cs @@ -1,5 +1,7 @@ using System; using System.ComponentModel.DataAnnotations; +using System.Runtime.CompilerServices; +using Volo.Abp.Validation; using Volo.Docs.Language; using Volo.Docs.Projects; @@ -9,11 +11,11 @@ namespace Volo.Docs.Documents { public Guid ProjectId { get; set; } - [StringLength(ProjectConsts.MaxVersionNameLength)] + [DynamicStringLength(typeof(ProjectConsts), nameof(ProjectConsts.MaxVersionNameLength))] public string Version { get; set; } [Required] - [StringLength(LanguageConsts.MaxLanguageCodeLength)] + [DynamicStringLength(typeof(LanguageConsts), nameof(LanguageConsts.MaxLanguageCodeLength))] public string LanguageCode { get; set; } } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetDocumentInput.cs b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetDocumentInput.cs index 412f41b82e..3646f2ade0 100644 --- a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetDocumentInput.cs +++ b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetDocumentInput.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel.DataAnnotations; +using Volo.Abp.Validation; using Volo.Docs.Language; using Volo.Docs.Projects; @@ -10,14 +11,14 @@ namespace Volo.Docs.Documents public Guid ProjectId { get; set; } [Required] - [StringLength(DocumentConsts.MaxNameLength)] + [DynamicStringLength(typeof(DocumentConsts), nameof(DocumentConsts.MaxNameLength))] public string Name { get; set; } - [StringLength(ProjectConsts.MaxVersionNameLength)] + [DynamicStringLength(typeof(ProjectConsts), nameof(ProjectConsts.MaxVersionNameLength))] public string Version { get; set; } [Required] - [StringLength(LanguageConsts.MaxLanguageCodeLength)] + [DynamicStringLength(typeof(LanguageConsts), nameof(LanguageConsts.MaxLanguageCodeLength))] public string LanguageCode { get; set; } } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetDocumentResourceInput.cs b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetDocumentResourceInput.cs index 6f759c47d8..52c1cf78af 100644 --- a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetDocumentResourceInput.cs +++ b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetDocumentResourceInput.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel.DataAnnotations; +using Volo.Abp.Validation; using Volo.Docs.Language; using Volo.Docs.Projects; @@ -10,14 +11,14 @@ namespace Volo.Docs.Documents public Guid ProjectId { get; set; } [Required] - [StringLength(DocumentConsts.MaxNameLength)] + [DynamicStringLength(typeof(DocumentConsts), nameof(DocumentConsts.MaxNameLength))] public string Name { get; set; } - [StringLength(ProjectConsts.MaxVersionNameLength)] + [DynamicStringLength(typeof(ProjectConsts), nameof(ProjectConsts.MaxVersionNameLength))] public string Version { get; set; } [Required] - [StringLength(LanguageConsts.MaxLanguageCodeLength)] + [DynamicStringLength(typeof(LanguageConsts), nameof(LanguageConsts.MaxLanguageCodeLength))] public string LanguageCode { get; set; } } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetNavigationDocumentInput.cs b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetNavigationDocumentInput.cs index 6866c8c633..ee4e3380ee 100644 --- a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetNavigationDocumentInput.cs +++ b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetNavigationDocumentInput.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel.DataAnnotations; +using Volo.Abp.Validation; using Volo.Docs.Language; using Volo.Docs.Projects; @@ -9,11 +10,11 @@ namespace Volo.Docs.Documents { public Guid ProjectId { get; set; } - [StringLength(ProjectConsts.MaxVersionNameLength)] + [DynamicStringLength(typeof(ProjectConsts), nameof(ProjectConsts.MaxVersionNameLength))] public string Version { get; set; } [Required] - [StringLength(LanguageConsts.MaxLanguageCodeLength)] + [DynamicStringLength(typeof(LanguageConsts), nameof(LanguageConsts.MaxLanguageCodeLength))] public string LanguageCode { get; set; } } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetParametersDocumentInput.cs b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetParametersDocumentInput.cs index 33bd25b394..1e277f36a3 100644 --- a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetParametersDocumentInput.cs +++ b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/GetParametersDocumentInput.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel.DataAnnotations; +using Volo.Abp.Validation; using Volo.Docs.Language; using Volo.Docs.Projects; @@ -9,11 +10,11 @@ namespace Volo.Docs.Documents { public Guid ProjectId { get; set; } - [StringLength(ProjectConsts.MaxVersionNameLength)] + [DynamicStringLength(typeof(ProjectConsts), nameof(ProjectConsts.MaxVersionNameLength))] public string Version { get; set; } [Required] - [StringLength(LanguageConsts.MaxLanguageCodeLength)] + [DynamicStringLength(typeof(LanguageConsts), nameof(LanguageConsts.MaxLanguageCodeLength))] public string LanguageCode { get; set; } } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Documents/DocumentConsts.cs b/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Documents/DocumentConsts.cs index f629abd0a4..04e3de3fd5 100644 --- a/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Documents/DocumentConsts.cs +++ b/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Documents/DocumentConsts.cs @@ -2,14 +2,49 @@ { public static class DocumentConsts { - public const int MaxNameLength = 255; - public const int MaxVersionNameLength = 128; - public const int MaxLanguageCodeNameLength = 128; - public const int MaxFileNameNameLength = 128; - public const int MaxFormatNameLength = 128; - public const int MaxEditLinkLength = 2048; - public const int MaxRootUrlLength = 2048; - public const int MaxRawRootUrlLength = 2048; - public const int MaxLocalDirectoryLength = 512; + /// + /// Default value: 255 + /// + public static int MaxNameLength { get; set; } = 255; + + /// + /// Default value: 128 + /// + public static int MaxVersionNameLength { get; set; } = 128; + + /// + /// Default value: 128 + /// + public static int MaxLanguageCodeNameLength { get; set; } = 128; + + /// + /// Default value: 128 + /// + public static int MaxFileNameNameLength { get; set; } = 128; + + /// + /// Default value: 128 + /// + public static int MaxFormatNameLength { get; set; } = 128; + + /// + /// Default value: 2048 + /// + public static int MaxEditLinkLength { get; set; } = 2048; + + /// + /// Default value: 2048 + /// + public static int MaxRootUrlLength { get; set; } = 2048; + + /// + /// Default value: 2048 + /// + public static int MaxRawRootUrlLength { get; set; } = 2048; + + /// + /// Default value: 512 + /// + public static int MaxLocalDirectoryLength { get; set; } = 512; } } diff --git a/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Language/LanguageConsts.cs b/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Language/LanguageConsts.cs index 867cc2dd4e..cd449a37fd 100644 --- a/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Language/LanguageConsts.cs +++ b/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Language/LanguageConsts.cs @@ -3,6 +3,9 @@ namespace Volo.Docs.Language { public static class LanguageConsts { - public const int MaxLanguageCodeLength = 10; + /// + /// Default value: 10 + /// + public static int MaxLanguageCodeLength { get; set; } = 10; } } diff --git a/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Projects/ProjectConsts.cs b/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Projects/ProjectConsts.cs index 927a1a4c59..3322fb7732 100644 --- a/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Projects/ProjectConsts.cs +++ b/modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Projects/ProjectConsts.cs @@ -2,12 +2,39 @@ { public static class ProjectConsts { - public const int MaxNameLength = 128; - public const int MaxShortNameLength = 32; - public const int MaxDefaultDocumentNameLength = 128; - public const int MaxNavigationDocumentNameLength = 128; - public const int MaxParametersDocumentNameLength = 128; - public const int MaxLatestVersionBranchNameLength = 128; - public const int MaxVersionNameLength = 128; + /// + /// Default value: 128 + /// + public static int MaxNameLength { get; set; } = 128; + + /// + /// Default value: 32 + /// + public static int MaxShortNameLength { get; set; } = 32; + + /// + /// Default value: 128 + /// + public static int MaxDefaultDocumentNameLength { get; set; } = 128; + + /// + /// Default value: 128 + /// + public static int MaxNavigationDocumentNameLength { get; set; } = 128; + + /// + /// Default value: 128 + /// + public static int MaxParametersDocumentNameLength { get; set; } = 128; + + /// + /// Default value: 128 + /// + public static int MaxLatestVersionBranchNameLength { get; set; } = 128; + + /// + /// Default value: 128 + /// + public static int MaxVersionNameLength { get; set; } = 128; } } From 89f1125a628117a036a12fe78ffea43d9b97dd82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87otur?= Date: Mon, 29 Jun 2020 15:26:49 +0300 Subject: [PATCH 144/190] Update FeatureValueConsts.cs --- .../FeatureManagement/FeatureValueConsts.cs | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureValueConsts.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureValueConsts.cs index 0fd1a644fa..f44deca44a 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureValueConsts.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureValueConsts.cs @@ -2,12 +2,24 @@ { public static class FeatureValueConsts { - public const int MaxNameLength = 128; + /// + /// Default value: 128 + /// + public static int MaxNameLength { get; set;} = 128; - public const int MaxProviderNameLength = 64; + /// + /// Default value: 64 + /// + public static int MaxProviderNameLength { get; set;} = 64; - public const int MaxProviderKeyLength = 64; + /// + /// Default value: 64 + /// + public static int MaxProviderKeyLength { get; set;} = 64; - public const int MaxValueLength = 128; + /// + /// Default value: 128 + /// + public static int MaxValueLength { get; set;} = 128; } } From 72e58df483caf7a78be1b80178bb1d131ac7a7bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87otur?= Date: Mon, 29 Jun 2020 15:30:50 +0300 Subject: [PATCH 145/190] Added summaries to identity module --- .../Abp/Identity/IdentityClaimTypeConsts.cs | 19 +++++++++++++++++++ .../Volo/Abp/Identity/IdentityRoleConsts.cs | 11 +++++++++++ .../Abp/Identity/IdentityUserClaimConsts.cs | 6 ++++++ .../Volo/Abp/Identity/IdentityUserConsts.cs | 14 +++++++++++++- .../Abp/Identity/IdentityUserLoginConsts.cs | 11 +++++++++++ .../Abp/Identity/IdentityUserTokenConsts.cs | 6 ++++++ 6 files changed, 66 insertions(+), 1 deletion(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityClaimTypeConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityClaimTypeConsts.cs index 6e15cb0cfc..d13d3fba0e 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityClaimTypeConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityClaimTypeConsts.cs @@ -2,10 +2,29 @@ { public class IdentityClaimTypeConsts { + /// + /// Default value: 256 + /// public static int MaxNameLength { get; set; } = 256; + + /// + /// Default value: 512 + /// public static int MaxRegexLength { get; set; } = 512; + + /// + /// Default value: 128 + /// public static int MaxRegexDescriptionLength { get; set; } = 128; + + /// + /// Default value: 256 + /// public static int MaxDescriptionLength { get; set; } = 256; + + /// + /// Default value: 256 + /// public static int MaxConcurrencyStampLength { get; set; } = 256; } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityRoleConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityRoleConsts.cs index 33e8e74977..dfed056854 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityRoleConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityRoleConsts.cs @@ -2,8 +2,19 @@ { public static class IdentityRoleConsts { + /// + /// Default value: 256 + /// public static int MaxNameLength { get; set; } = 256; + + /// + /// Default value: 256 + /// public static int MaxNormalizedNameLength { get; set; } = 256; + + /// + /// Default value: 256 + /// public static int MaxConcurrencyStampLength { get; set; } = 256; } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserClaimConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserClaimConsts.cs index a850d6cff2..84ba493853 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserClaimConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserClaimConsts.cs @@ -2,8 +2,14 @@ { public static class IdentityUserClaimConsts { + /// + /// Default value: 256 + /// public static int MaxClaimTypeLength { get; set; } = 256; + /// + /// Default value: 1024 + /// public static int MaxClaimValueLength { get; set; } = 1024; } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserConsts.cs index 7b1a90dacc..378f545dff 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserConsts.cs @@ -18,12 +18,24 @@ namespace Volo.Abp.Identity public static int MaxPhoneNumberLength { get; set; } = AbpUserConsts.MaxPhoneNumberLength; + /// + /// Default value: 128 + /// public static int MaxPasswordLength { get; set; } = 128; + /// + /// Default value: 256 + /// public static int MaxPasswordHashLength { get; set; } = 256; + /// + /// Default value: 256 + /// public static int MaxSecurityStampLength { get; set; } = 256; - + + /// + /// Default value: 256 + /// public static int MaxConcurrencyStampLength { get; set; } = 256; } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserLoginConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserLoginConsts.cs index 3f95dfd634..8435221fd3 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserLoginConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserLoginConsts.cs @@ -2,8 +2,19 @@ { public static class IdentityUserLoginConsts { + /// + /// Default value: 64 + /// public static int MaxLoginProviderLength { get; set; } = 64; + + /// + /// Default value: 196 + /// public static int MaxProviderKeyLength { get; set; } = 196; + + /// + /// Default value: 128 + /// public static int MaxProviderDisplayNameLength { get; set; } = 128; } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserTokenConsts.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserTokenConsts.cs index 1e4eb4794b..a585a8383b 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserTokenConsts.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityUserTokenConsts.cs @@ -2,8 +2,14 @@ { public static class IdentityUserTokenConsts { + /// + /// Default value: 64 + /// public static int MaxLoginProviderLength { get; set; } = 64; + /// + /// Default value: 128 + /// public static int MaxNameLength { get; set; } = 128; } } From 581f92cf8e309e9848bce7e20566816325641ee9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87otur?= Date: Mon, 29 Jun 2020 15:40:58 +0300 Subject: [PATCH 146/190] Identity server module consts converted to static --- .../Clients/ClientIdPRestrictionConsts.cs | 5 ++- .../ClientPostLogoutRedirectUriConsts.cs | 5 ++- .../Clients/ClientPropertyConsts.cs | 11 ++++-- .../Clients/ClientRedirectUriConsts.cs | 5 ++- .../Clients/ClientScopeConsts.cs | 5 ++- .../Grants/PersistedGrantConsts.cs | 35 +++++++++++++++---- .../IdentityResourceConsts.cs | 17 +++++++-- .../Volo/Abp/IdentityServer/SecretConsts.cs | 18 ++++++++-- .../Abp/IdentityServer/UserClaimConsts.cs | 5 ++- 9 files changed, 87 insertions(+), 19 deletions(-) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientIdPRestrictionConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientIdPRestrictionConsts.cs index c71301871a..b238a01935 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientIdPRestrictionConsts.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientIdPRestrictionConsts.cs @@ -2,6 +2,9 @@ { public class ClientIdPRestrictionConsts { - public const int ProviderMaxLength = 200; + /// + /// Default value: 200 + /// + public static int ProviderMaxLength { get; set; } = 200; } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientPostLogoutRedirectUriConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientPostLogoutRedirectUriConsts.cs index 3092232d47..7d4764e1a3 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientPostLogoutRedirectUriConsts.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientPostLogoutRedirectUriConsts.cs @@ -2,7 +2,10 @@ { public class ClientPostLogoutRedirectUriConsts { - public const int PostLogoutRedirectUriMaxLength = 2000; + /// + /// Default value: 200 + /// + public static int PostLogoutRedirectUriMaxLength { get; set; } = 2000; public static int PostLogoutRedirectUriMaxLengthValue { get; set; } = 2000; } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientPropertyConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientPropertyConsts.cs index 6535304596..664e1076b0 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientPropertyConsts.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientPropertyConsts.cs @@ -2,7 +2,14 @@ { public class ClientPropertyConsts { - public const int KeyMaxLength = 250; - public const int ValueMaxLength = 2000; + /// + /// Default value: 250 + /// + public static int KeyMaxLength { get; set; } = 250; + + /// + /// Default value: 2000 + /// + public static int ValueMaxLength { get; set; } = 2000; } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientRedirectUriConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientRedirectUriConsts.cs index e972388487..7650a3d952 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientRedirectUriConsts.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientRedirectUriConsts.cs @@ -2,7 +2,10 @@ { public class ClientRedirectUriConsts { - public const int RedirectUriMaxLength = 2000; + /// + /// Default value: 2000 + /// + public static int RedirectUriMaxLength { get; set; } = 2000; public static int RedirectUriMaxLengthValue { get; set; } = 2000; } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientScopeConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientScopeConsts.cs index 6a5b62e692..0ec1c04595 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientScopeConsts.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientScopeConsts.cs @@ -2,6 +2,9 @@ { public class ClientScopeConsts { - public const int ScopeMaxLength = 200; + /// + /// Default value: 200 + /// + public static int ScopeMaxLength { get; set; } = 200; } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Grants/PersistedGrantConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Grants/PersistedGrantConsts.cs index 6d0836ab17..b1dd21d6f8 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Grants/PersistedGrantConsts.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Grants/PersistedGrantConsts.cs @@ -2,11 +2,34 @@ { public class PersistedGrantConsts { - public const int KeyMaxLength = 200; - public const int TypeMaxLength = 50; - public const int SubjectIdMaxLength = 200; - public const int ClientIdMaxLength = 200; - public const int DataMaxLength = 50000; - public static int DataMaxLengthValue { get; set; }= 50000; + /// + /// Default value: 200 + /// + public static int KeyMaxLength { get; set; } = 200; + + /// + /// Default value: 50 + /// + public static int TypeMaxLength { get; set; } = 50; + + /// + /// Default value: 200 + /// + public static int SubjectIdMaxLength { get; set; } = 200; + + /// + /// Default value: 200 + /// + public static int ClientIdMaxLength { get; set; } = 200; + + /// + /// Default value: 50000 + /// + public static int DataMaxLength { get; set; } = 50000; + + /// + /// Default value: 50000 + /// + public static int DataMaxLengthValue { get; set; } = 50000; } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceConsts.cs index c60cc34ad8..a7c713e161 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceConsts.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceConsts.cs @@ -2,8 +2,19 @@ { public class IdentityResourceConsts { - public const int NameMaxLength = 200; - public const int DisplayNameMaxLength = 200; - public const int DescriptionMaxLength = 1000; + /// + /// Default value: 200 + /// + public static int NameMaxLength { get; set; } = 200; + + /// + /// Default value: 200 + /// + public static int DisplayNameMaxLength { get; set; } = 200; + + /// + /// Default value: 200 + /// + public static int DescriptionMaxLength { get; set; } = 1000; } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/SecretConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/SecretConsts.cs index 76635e322e..156088a97b 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/SecretConsts.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/SecretConsts.cs @@ -2,9 +2,21 @@ { public class SecretConsts { - public const int TypeMaxLength = 250; - public const int ValueMaxLength = 4000; + /// + /// Default value: 250 + /// + public static int TypeMaxLength { get; set; } = 250; + + /// + /// Default value: 4000 + /// + public static int ValueMaxLength { get; set; } = 4000; + public static int ValueMaxLengthValue { get; set; } = ValueMaxLength; - public const int DescriptionMaxLength = 2000; + + /// + /// Default value: 2000 + /// + public static int DescriptionMaxLength { get; set; } = 2000; } } \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/UserClaimConsts.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/UserClaimConsts.cs index 9133482f1f..cb0279fd2b 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/UserClaimConsts.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/UserClaimConsts.cs @@ -2,6 +2,9 @@ { public class UserClaimConsts { - public const int TypeMaxLength = 200; + /// + /// Default value: 200 + /// + public static int TypeMaxLength { get; set; } = 200; } } \ No newline at end of file From 40925bbffd8e36e86fae92949e563a2e317585f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87otur?= Date: Mon, 29 Jun 2020 15:43:44 +0300 Subject: [PATCH 147/190] Update PermissionGrantConsts.cs --- .../PermissionManagement/PermissionGrantConsts.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/PermissionGrantConsts.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/PermissionGrantConsts.cs index 8d579638ec..5cb2397349 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/PermissionGrantConsts.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/PermissionGrantConsts.cs @@ -2,10 +2,19 @@ { public static class PermissionGrantConsts { - public const int MaxNameLength = 128; + /// + /// Default value: 128 + /// + public static int MaxNameLength { get; set; } = 128; - public const int MaxProviderNameLength = 64; + /// + /// Default value: 64 + /// + public static int MaxProviderNameLength { get; set; } = 64; - public const int MaxProviderKeyLength = 64; + /// + /// Default value: 64 + /// + public static int MaxProviderKeyLength { get; set; } = 64; } } From 855c952e6f3f1275421362c5a3b4ffb38a0e7d51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87otur?= Date: Mon, 29 Jun 2020 15:45:24 +0300 Subject: [PATCH 148/190] Update SettingConsts.cs --- .../Abp/SettingManagement/SettingConsts.cs | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingConsts.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingConsts.cs index 44a21f3ccb..e23a0e39a5 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingConsts.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/SettingConsts.cs @@ -2,10 +2,26 @@ { public static class SettingConsts { - public const int MaxNameLength = 128; - public const int MaxValueLength = 2048; + /// + /// Default value: 128 + /// + public static int MaxNameLength { get; set; } = 128; + + /// + /// Default value: 2048 + /// + public static int MaxValueLength { get; set; } = 2048; + public static int MaxValueLengthValue { get; set; } = MaxValueLength; - public const int MaxProviderNameLength = 64; - public const int MaxProviderKeyLength = 64; + + /// + /// Default value: 64 + /// + public static int MaxProviderNameLength { get; set; } = 64; + + /// + /// Default value: 64 + /// + public static int MaxProviderKeyLength { get; set; } = 64; } } From 87f8b2672afe2569a321a66aeaf48a0f68d684d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87otur?= Date: Mon, 29 Jun 2020 15:49:42 +0300 Subject: [PATCH 149/190] Tenant Management Module consts converted to static --- .../TenantManagement/TenantCreateOrUpdateDtoBase.cs | 3 ++- .../TenantManagement/TenantConnectionStringConsts.cs | 10 ++++++++-- .../Volo/Abp/TenantManagement/TenantConsts.cs | 5 ++++- .../Tenants/ConnectionStringsModal.cshtml.cs | 3 ++- .../TenantManagement/Tenants/CreateModal.cshtml.cs | 3 ++- .../Pages/TenantManagement/Tenants/EditModal.cshtml.cs | 3 ++- 6 files changed, 20 insertions(+), 7 deletions(-) diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/TenantCreateOrUpdateDtoBase.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/TenantCreateOrUpdateDtoBase.cs index 19f73b0d51..7dc805ea79 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/TenantCreateOrUpdateDtoBase.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/TenantCreateOrUpdateDtoBase.cs @@ -1,12 +1,13 @@ using System.ComponentModel.DataAnnotations; using Volo.Abp.ObjectExtending; +using Volo.Abp.Validation; namespace Volo.Abp.TenantManagement { public abstract class TenantCreateOrUpdateDtoBase : ExtensibleObject { [Required] - [StringLength(TenantConsts.MaxNameLength)] + [DynamicStringLength(typeof(TenantConsts), nameof(TenantConsts.MaxNameLength))] public string Name { get; set; } } } \ No newline at end of file diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/TenantConnectionStringConsts.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/TenantConnectionStringConsts.cs index 4cdf8dee2a..b177e8d046 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/TenantConnectionStringConsts.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/TenantConnectionStringConsts.cs @@ -2,8 +2,14 @@ { public static class TenantConnectionStringConsts { - public const int MaxNameLength = 64; + /// + /// Default value: 64 + /// + public static int MaxNameLength { get; set; } = 64; - public const int MaxValueLength = 1024; + /// + /// Default value: 1024 + /// + public static int MaxValueLength { get; set; } = 1024; } } \ No newline at end of file diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/TenantConsts.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/TenantConsts.cs index 328c422ab9..10de5e8773 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/TenantConsts.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/TenantConsts.cs @@ -2,6 +2,9 @@ { public static class TenantConsts { - public const int MaxNameLength = 64; + /// + /// Default value: 64 + /// + public static int MaxNameLength { get; set; } = 64; } } diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/ConnectionStringsModal.cshtml.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/ConnectionStringsModal.cshtml.cs index 9093437f98..45a36060e0 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/ConnectionStringsModal.cshtml.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/ConnectionStringsModal.cshtml.cs @@ -2,6 +2,7 @@ using System; using System.ComponentModel.DataAnnotations; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using Volo.Abp.Validation; namespace Volo.Abp.TenantManagement.Web.Pages.TenantManagement.Tenants { @@ -53,7 +54,7 @@ namespace Volo.Abp.TenantManagement.Web.Pages.TenantManagement.Tenants public bool UseSharedDatabase { get; set; } - [StringLength(TenantConnectionStringConsts.MaxValueLength)] + [DynamicStringLength(typeof(TenantConnectionStringConsts), nameof(TenantConnectionStringConsts.MaxValueLength))] public string DefaultConnectionString { get; set; } } } diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/CreateModal.cshtml.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/CreateModal.cshtml.cs index fa517594ee..0c1e6e0bec 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/CreateModal.cshtml.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/CreateModal.cshtml.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using Volo.Abp.Validation; namespace Volo.Abp.TenantManagement.Web.Pages.TenantManagement.Tenants { @@ -34,7 +35,7 @@ namespace Volo.Abp.TenantManagement.Web.Pages.TenantManagement.Tenants public class TenantInfoModel { [Required] - [StringLength(TenantConsts.MaxNameLength)] + [DynamicStringLength(typeof(TenantConsts), nameof(TenantConsts.MaxNameLength))] public string Name { get; set; } [Required] diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/EditModal.cshtml.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/EditModal.cshtml.cs index 74ac176b02..736d0174cf 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/EditModal.cshtml.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/EditModal.cshtml.cs @@ -2,6 +2,7 @@ using System; using System.ComponentModel.DataAnnotations; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using Volo.Abp.Validation; namespace Volo.Abp.TenantManagement.Web.Pages.TenantManagement.Tenants { @@ -42,7 +43,7 @@ namespace Volo.Abp.TenantManagement.Web.Pages.TenantManagement.Tenants public Guid Id { get; set; } [Required] - [StringLength(TenantConsts.MaxNameLength)] + [DynamicStringLength(typeof(TenantConsts), nameof(TenantConsts.MaxNameLength))] [Display(Name = "DisplayName:TenantName")] public string Name { get; set; } } From 397abba3baff82cf46b3db04743273fa8be0e96c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87otur?= Date: Mon, 29 Jun 2020 16:09:40 +0300 Subject: [PATCH 150/190] Update AbpUserConsts.cs --- .../Volo/Abp/Users/AbpUserConsts.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/modules/users/src/Volo.Abp.Users.Domain.Shared/Volo/Abp/Users/AbpUserConsts.cs b/modules/users/src/Volo.Abp.Users.Domain.Shared/Volo/Abp/Users/AbpUserConsts.cs index ee37c6c9f4..efbd2e02b2 100644 --- a/modules/users/src/Volo.Abp.Users.Domain.Shared/Volo/Abp/Users/AbpUserConsts.cs +++ b/modules/users/src/Volo.Abp.Users.Domain.Shared/Volo/Abp/Users/AbpUserConsts.cs @@ -2,14 +2,29 @@ namespace Volo.Abp.Users { public class AbpUserConsts { + /// + /// Default value: 256 + /// public static int MaxUserNameLength { get; set; } = 256; + /// + /// Default value: 64 + /// public static int MaxNameLength { get; set; } = 64; + /// + /// Default value: 64 + /// public static int MaxSurnameLength { get; set; } = 64; + /// + /// Default value: 256 + /// public static int MaxEmailLength { get; set; } = 256; + /// + /// Default value: 16 + /// public static int MaxPhoneNumberLength { get; set; } = 16; } } \ No newline at end of file From 1154962d4d4379775cb0a001ab5714d4725bde20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 29 Jun 2020 18:49:39 +0300 Subject: [PATCH 151/190] #4528 Support embedded files with manifest created by Microsoft.Extensions.FileProviders.Embedded --- .../Volo.Abp.VirtualFileSystem.csproj | 1 + .../AbpVirtualFileSystemOptions.cs | 2 +- .../Embedded/EmbeddedFileSet.cs | 27 +++++-- .../VirtualFileSystem/VirtualFileProvider.cs | 52 +++----------- .../VirtualFileSystem/VirtualFileSetInfo.cs | 35 ++++++++++ .../VirtualFileSystem/VirtualFileSetList.cs | 9 +-- .../VirtualFileSetListExtensions.cs | 70 ++++++++++++++----- .../Volo.Abp.VirtualFileSystem.Tests.csproj | 2 + .../MyResources/js/my{test}.2.9.min.js | 1 + .../VirtualFileProvider_Tests.cs | 25 ++++++- ...anyName.MyProjectName.Domain.Shared.csproj | 8 ++- .../MyFolder/{Person.Name}.txt | 1 + 12 files changed, 152 insertions(+), 81 deletions(-) create mode 100644 framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetInfo.cs create mode 100644 framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/MyResources/js/my{test}.2.9.min.js create mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyFolder/{Person.Name}.txt diff --git a/framework/src/Volo.Abp.VirtualFileSystem/Volo.Abp.VirtualFileSystem.csproj b/framework/src/Volo.Abp.VirtualFileSystem/Volo.Abp.VirtualFileSystem.csproj index f3a0fefb2a..b4aa55b1c0 100644 --- a/framework/src/Volo.Abp.VirtualFileSystem/Volo.Abp.VirtualFileSystem.csproj +++ b/framework/src/Volo.Abp.VirtualFileSystem/Volo.Abp.VirtualFileSystem.csproj @@ -17,6 +17,7 @@ + diff --git a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/AbpVirtualFileSystemOptions.cs b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/AbpVirtualFileSystemOptions.cs index c4a4d203d2..aff1aee4e9 100644 --- a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/AbpVirtualFileSystemOptions.cs +++ b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/AbpVirtualFileSystemOptions.cs @@ -3,7 +3,7 @@ public class AbpVirtualFileSystemOptions { public VirtualFileSetList FileSets { get; } - + public AbpVirtualFileSystemOptions() { FileSets = new VirtualFileSetList(); diff --git a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedFileSet.cs b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedFileSet.cs index d2a0556527..9c09a901dc 100644 --- a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedFileSet.cs +++ b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedFileSet.cs @@ -8,7 +8,7 @@ using Microsoft.Extensions.FileProviders; namespace Volo.Abp.VirtualFileSystem.Embedded { - public class EmbeddedFileSet : IVirtualFileSet + public class EmbeddedFileSet : DictionaryBasedFileProvider { [NotNull] public Assembly Assembly { get; } @@ -16,19 +16,22 @@ namespace Volo.Abp.VirtualFileSystem.Embedded [CanBeNull] public string BaseNamespace { get; } - [CanBeNull] - public string BaseFolderInProject { get; } + protected override IDictionary Files => _files.Value; + private readonly Lazy> _files; public EmbeddedFileSet( [NotNull] Assembly assembly, - [CanBeNull] string baseNamespace = null, - [CanBeNull] string baseFolderInProject = null) + [CanBeNull] string baseNamespace = null) { Check.NotNull(assembly, nameof(assembly)); Assembly = assembly; BaseNamespace = baseNamespace; - BaseFolderInProject = baseFolderInProject; + + _files = new Lazy>( + CreateFiles, + true + ); } public void AddFiles(Dictionary files) @@ -127,5 +130,17 @@ namespace Volo.Abp.VirtualFileSystem.Embedded return filePath.Substring(filePath.LastIndexOf("/", StringComparison.Ordinal) + 1); } + + protected override string NormalizePath(string subpath) + { + return VirtualFilePathHelper.NormalizePath(subpath); + } + + private Dictionary CreateFiles() + { + var files = new Dictionary(StringComparer.OrdinalIgnoreCase); + AddFiles(files); + return files; + } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileProvider.cs b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileProvider.cs index 5f90ef7925..eb4cd4e415 100644 --- a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileProvider.cs +++ b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileProvider.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Options; @@ -28,6 +27,11 @@ namespace Volo.Abp.VirtualFileSystem public virtual IDirectoryContents GetDirectoryContents(string subpath) { + if (subpath == "") + { + subpath = "/"; + } + return _hybridFileProvider.GetDirectoryContents(subpath); } @@ -42,52 +46,12 @@ namespace Volo.Abp.VirtualFileSystem fileProviders.Add(dynamicFileProvider); - if (_options.FileSets.PhysicalPaths.Any()) + foreach (var fileSet in _options.FileSets.AsEnumerable().Reverse()) { - fileProviders.AddRange( - _options.FileSets.PhysicalPaths - .Select(rootPath => new PhysicalFileProvider(rootPath)) - .Reverse() - ); + fileProviders.Add(fileSet.FileProvider); } - fileProviders.Add(new InternalVirtualFileProvider(_options)); - return new CompositeFileProvider(fileProviders); } - - protected class InternalVirtualFileProvider : DictionaryBasedFileProvider - { - protected override IDictionary Files => _files.Value; - - private readonly AbpVirtualFileSystemOptions _options; - private readonly Lazy> _files; - - public InternalVirtualFileProvider(AbpVirtualFileSystemOptions options) - { - _options = options; - _files = new Lazy>( - CreateFiles, - true - ); - } - - private Dictionary CreateFiles() - { - var files = new Dictionary(StringComparer.OrdinalIgnoreCase); - - foreach (var set in _options.FileSets) - { - set.AddFiles(files); - } - - return files; - } - - protected override string NormalizePath(string subpath) - { - return VirtualFilePathHelper.NormalizePath(subpath); - } - } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetInfo.cs b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetInfo.cs new file mode 100644 index 0000000000..b425932c51 --- /dev/null +++ b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetInfo.cs @@ -0,0 +1,35 @@ +using System.IO; +using System.Reflection; +using Microsoft.Extensions.FileProviders; + +namespace Volo.Abp.VirtualFileSystem +{ + public class VirtualFileSetInfo + { + public IFileProvider FileProvider + { + get => _fileProvider; + set => _fileProvider = Check.NotNull(value, nameof(value)); + } + private IFileProvider _fileProvider; + + public VirtualFileSetInfo(IFileProvider fileProvider) + { + FileProvider = fileProvider; + } + } + + public class EmbeddedVirtualFileSetInfo : VirtualFileSetInfo + { + public Assembly Assembly { get; } + + public string BaseFolder { get; } + + public EmbeddedVirtualFileSetInfo(IFileProvider fileProvider, Assembly assembly, string baseFolder = null) + : base(fileProvider) + { + Assembly = assembly; + BaseFolder = baseFolder; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetList.cs b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetList.cs index 2ddd0ff3a4..371f8350d8 100644 --- a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetList.cs +++ b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetList.cs @@ -2,13 +2,8 @@ namespace Volo.Abp.VirtualFileSystem { - public class VirtualFileSetList : List + public class VirtualFileSetList : List { - public List PhysicalPaths { get; } - - public VirtualFileSetList() - { - PhysicalPaths = new List(); - } + } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetListExtensions.cs b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetListExtensions.cs index 399f76f408..ebf745916d 100644 --- a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetListExtensions.cs +++ b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetListExtensions.cs @@ -1,44 +1,76 @@ using System; using System.IO; -using System.Linq; +using System.Reflection; using JetBrains.Annotations; +using Microsoft.Extensions.FileProviders; using Volo.Abp.VirtualFileSystem.Embedded; namespace Volo.Abp.VirtualFileSystem { public static class VirtualFileSetListExtensions { - public static void AddEmbedded([NotNull] this VirtualFileSetList list, [CanBeNull] string baseNamespace = null, string baseFolderInProject = null) + public static void AddEmbedded( + [NotNull] this VirtualFileSetList list, + [CanBeNull] string baseNamespace = null, + [CanBeNull] string baseFolder = null) { Check.NotNull(list, nameof(list)); - list.Add( - new EmbeddedFileSet( - typeof(T).Assembly, - baseNamespace, - baseFolderInProject - ) + var assembly = typeof(T).Assembly; + var fileProvider = CreateFileProvider( + assembly, + baseNamespace, + baseFolder ); + + list.Add(new EmbeddedVirtualFileSetInfo(fileProvider, assembly, baseFolder)); } - public static void ReplaceEmbeddedByPhysical([NotNull] this VirtualFileSetList list, [NotNull] string pyhsicalPath) + private static IFileProvider CreateFileProvider( + [NotNull] Assembly assembly, + [CanBeNull] string baseNamespace = null, + [CanBeNull] string baseFolder = null) { - Check.NotNull(list, nameof(list)); - Check.NotNull(pyhsicalPath, nameof(pyhsicalPath)); + Check.NotNull(assembly, nameof(assembly)); - var assembly = typeof(T).Assembly; - var embeddedFileSets = list.OfType().Where(fs => fs.Assembly == assembly).ToList(); + var info = assembly.GetManifestResourceInfo("Microsoft.Extensions.FileProviders.Embedded.Manifest.xml"); - foreach (var embeddedFileSet in embeddedFileSets) + if (info == null) { - list.Remove(embeddedFileSet); + return new EmbeddedFileSet(assembly, baseNamespace); + } + + if (baseFolder == null) + { + return new ManifestEmbeddedFileProvider(assembly); + } + + return new ManifestEmbeddedFileProvider(assembly, baseFolder); + } + + public static void ReplaceEmbeddedByPhysical( + [NotNull] this VirtualFileSetList fileSets, + [NotNull] string pyhsicalPath) + { + Check.NotNull(fileSets, nameof(fileSets)); + Check.NotNullOrWhiteSpace(pyhsicalPath, nameof(pyhsicalPath)); + + var assembly = typeof(T).Assembly; - if (!embeddedFileSet.BaseFolderInProject.IsNullOrEmpty()) + for (var i = 0; i < fileSets.Count; i++) + { + if (fileSets[i] is EmbeddedVirtualFileSetInfo embeddedVirtualFileSet && + embeddedVirtualFileSet.Assembly == assembly) { - pyhsicalPath = Path.Combine(pyhsicalPath, embeddedFileSet.BaseFolderInProject); - } + var thisPath = pyhsicalPath; - list.PhysicalPaths.Add(pyhsicalPath); + if (!embeddedVirtualFileSet.BaseFolder.IsNullOrEmpty()) + { + thisPath = Path.Combine(thisPath, embeddedVirtualFileSet.BaseFolder); + } + + fileSets[i] = new VirtualFileSetInfo(new PhysicalFileProvider(thisPath)); + } } } } diff --git a/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj b/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj index 9f8f904aa4..bcb9dcbf74 100644 --- a/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj +++ b/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj @@ -4,6 +4,7 @@ netcoreapp3.1 + true @@ -15,6 +16,7 @@ + diff --git a/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/MyResources/js/my{test}.2.9.min.js b/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/MyResources/js/my{test}.2.9.min.js new file mode 100644 index 0000000000..1c74f24545 --- /dev/null +++ b/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/MyResources/js/my{test}.2.9.min.js @@ -0,0 +1 @@ +//my{test}.2.9.min.js-content \ No newline at end of file diff --git a/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs b/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs index 2243d9a11a..aae01ff912 100644 --- a/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs +++ b/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs @@ -1,5 +1,4 @@ -using System; -using System.IO; +using System.IO; using System.Linq; using System.Text; using Microsoft.Extensions.DependencyInjection; @@ -34,6 +33,22 @@ namespace Volo.Abp.VirtualFileSystem Encoding.UTF8.GetString(stream.GetAllBytes()).ShouldBe("//jquery-3-1-1-min.js-contents"); } } + + [Fact] + public void Should_Define_And_Get_Embedded_Resources_With_Special_Chars() + { + //Act + var resource = _virtualFileProvider.GetFileInfo("/js/my{test}.2.9.min.js"); + + //Assert + resource.ShouldNotBeNull(); + resource.Exists.ShouldBeTrue(); + + using (var stream = resource.CreateReadStream()) + { + Encoding.UTF8.GetString(stream.GetAllBytes()).ShouldBe("//my{test}.2.9.min.js-content"); + } + } [Fact] public void Should_Define_And_Get_Embedded_Directory_Contents() @@ -45,7 +60,9 @@ namespace Volo.Abp.VirtualFileSystem contents.Exists.ShouldNotBeNull(); var contentList = contents.ToList(); + contentList.ShouldContain(x => x.Name == "jquery-3-1-1-min.js"); + contentList.ShouldContain(x => x.Name == "my{test}.2.9.min.js"); } [Theory] @@ -70,7 +87,9 @@ namespace Volo.Abp.VirtualFileSystem { Configure(options => { - options.FileSets.AddEmbedded("Volo.Abp.VirtualFileSystem.MyResources"); + options.FileSets.AddEmbedded( + baseFolder: "/Volo/Abp/VirtualFileSystem/MyResources" + ); }); } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj index f0b3cc8b33..72ba0ec00f 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj @@ -5,8 +5,9 @@ netstandard2.0 MyCompanyName.MyProjectName + true - + @@ -23,4 +24,9 @@ + + + + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyFolder/{Person.Name}.txt b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyFolder/{Person.Name}.txt new file mode 100644 index 0000000000..d61a270d39 --- /dev/null +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyFolder/{Person.Name}.txt @@ -0,0 +1 @@ +testing just... \ No newline at end of file From 95ca82762d17c0612355ded869348c3807d7a4d5 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Mon, 29 Jun 2020 20:00:52 +0300 Subject: [PATCH 152/190] docs: add v3 breaking change for ListService --- docs/en/UI/Angular/List-Service.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/en/UI/Angular/List-Service.md b/docs/en/UI/Angular/List-Service.md index b42d11d4a5..6d16b73ae8 100644 --- a/docs/en/UI/Angular/List-Service.md +++ b/docs/en/UI/Angular/List-Service.md @@ -154,3 +154,26 @@ You may use observables in combination with [AsyncPipe](https://angular.io/guide ``` + +## Breaking Change with ABP v3.0 + +We had to modify the `ListService` to make it work with `ngx-datatable`. Previously, the minimum value for `page` property was `1` and you could use it like this: + +```html + + +``` + +As of v3.0, with ngx-datatable, the `page` property has to be set as `0` for inital page. Therefore, if you used `ListService` on your tables before and are going to keep `abp-table`, you need to make the following change: + +```html + + +``` + +**Important Note:** The `abp-table` is not removed, but is deprecated and will be removed in the future. Please consider switching to ngx-datatable. From 68d6120e5eb689a9a99218857f15a6ce310471d0 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Mon, 29 Jun 2020 21:33:56 +0300 Subject: [PATCH 153/190] docs: show how RoutesService works in modifying the menu --- docs/en/UI/Angular/Modifying-the-Menu.md | 219 +++++++++++++++-------- 1 file changed, 145 insertions(+), 74 deletions(-) diff --git a/docs/en/UI/Angular/Modifying-the-Menu.md b/docs/en/UI/Angular/Modifying-the-Menu.md index 450a5aecd1..95370b49bf 100644 --- a/docs/en/UI/Angular/Modifying-the-Menu.md +++ b/docs/en/UI/Angular/Modifying-the-Menu.md @@ -25,9 +25,99 @@ export const environment = { ## How to Add a Navigation Element +### Via `RoutesService` + +You can add routes to the menu by calling the `add` method of `RoutesService`. It is a singleton service, i.e. provided in root, so you can inject and use it immediately. + +```js +import { RoutesService, eLayoutType } from '@abp/ng.core'; +import { Component } from '@angular/core'; + +@Component(/* component metadata */) +export class AppComponent { + constructor(routes: RoutesService) { + routes.add([ + { + path: '/your-path', + name: 'Your navigation', + order: 101, + iconClass: 'fas fa-question-circle', + requiredPolicy: 'permission key here', + layout: eLayoutType.application, + }, + { + path: '/your-path/child', + name: 'Your child navigation', + parentName: 'Your navigation', + order: 1, + requiredPolicy: 'permission key here', + }, + ]); + } +} +``` + +An alternative and probably cleaner way is to use a route provider. First create a provider: + +```js +// route.provider.ts +import { RoutesService, eLayoutType } from '@abp/ng.core'; +import { APP_INITIALIZER } from '@angular/core'; + +export const APP_ROUTE_PROVIDER = [ + { provide: APP_INITIALIZER, useFactory: configureRoutes, deps: [RoutesService], multi: true }, +]; + +function configureRoutes(routes: RoutesService) { + return () => { + routes.add([ + { + path: '/your-path', + name: 'Your navigation', + requiredPolicy: 'permission key here', + order: 101, + iconClass: 'fas fa-question-circle', + layout: eLayoutType.application, + }, + { + path: '/your-path/child', + name: 'Your child navigation', + parentName: 'Your navigation', + requiredPolicy: 'permission key here', + order: 1, + }, + ]); + }; +} +``` + +...and then in app.module.ts... + +```js +import { NgModule } from '@angular/core'; +import { APP_ROUTE_PROVIDER } from './route.provider'; + +@NgModule({ + providers: [APP_ROUTE_PROVIDER], + // imports, declarations, and bootstrap +}) +export class AppModule {} +``` + +Here is what every property works as: + +- `path` is the absolute path of the navigation element. +- `name` is the label of the navigation element. A localization key or a localization object can be passed. +- `parentName` is a reference to the `name` of the parent route in the menu and is used for creating multi-level menu items. +- `requiredPolicy` is the permission key to access the page. See the [Permission Management document](./Permission-Management.md) +- `order` is the order of the navigation element. "Administration" has an order of `100`, so keep that in mind when ordering top level menu items. +- `iconClass` is the class of the `i` tag, which is placed to the left of the navigation label. +- `layout` defines in which layout the route will be loaded. (default: `eLayoutType.empty`) +- `invisible` makes the item invisible in the menu. (default: `false`) + ### Via `routes` Property in `AppRoutingModule` -You can define your routes by adding `routes` as a child property to `data` property of a route configuration in the `app-routing.module`. The `@abp/ng.core` package organizes your routes and stores them in the `ConfigState`. `ApplicationLayoutComponent` gets routes from store and displays them on the menu. +You can define your routes by adding `routes` as a child property to `data` property of a route configuration in the `app-routing.module`. The `@abp/ng.core` package organizes your routes and stores them in the `RoutesService`. You can add the `routes` property like below: @@ -37,7 +127,7 @@ You can add the `routes` property like below: data: { routes: { name: 'Your navigation', - order: 3, + order: 101, iconClass: 'fas fa-question-circle', requiredPolicy: 'permission key here', children: [ @@ -48,99 +138,80 @@ You can add the `routes` property like below: requiredPolicy: 'permission key here', }, ], - } as ABP.Route, // can be imported from @abp/ng.core - } + }, + }, } ``` -- `name` is the label of the navigation element. A localization key or a localization object can be passed. -- `order` is the order of the navigation element. -- `iconClass` is the class of the `i` tag, which is placed to the left of the navigation label. -- `requiredPolicy` is the permission key to access the page. See the [Permission Management document](./Permission-Management.md) -- `children` is an array and is used for declaring child navigation elements. The child navigation element will be placed as a child route which will be available at `'/your-path/child'` based on the given `path` property. - -After adding the `routes` property as described above, the navigation menu looks like this: - -![navigation-menu-via-app-routing](./images/navigation-menu-via-app-routing.png) - -## Via ConfigState - -The `dispatchAddRoute` method of `ConfigStateService` adds a new navigation element to the menu. - -```js -// this.config is instance of ConfigStateService - -const newRoute: ABP.Route = { - name: 'My New Page', - iconClass: 'fa fa-dashboard', - path: 'page', - invisible: false, - order: 2, - requiredPolicy: 'MyProjectName.MyNewPage', -} as Omit; - -this.config.dispatchAddRoute(newRoute); -// returns a state stream which emits after dispatch action is complete -``` - -The `newRoute` will be placed as at root level, i.e. without any parent routes, and its url will be stored as `'/path'`. - -If you want **to add a child route, you can do this:** +Alternatively, you can do this: ```js -// this.config is instance of ConfigStateService -// eIdentityRouteNames enum can be imported from @abp/ng.identity - -const newRoute: ABP.Route = { - parentName: eIdentityRouteNames.IdentityManagement, - name: 'My New Page', - iconClass: 'fa fa-dashboard', - path: 'page', - invisible: false, - order: 3, - requiredPolicy: 'MyProjectName.MyNewPage' -} as Omit; - -this.config.dispatchAddRoute(newRoute); -// returns a state stream which emits after dispatch action is complete +{ + path: 'your-path', + data: { + routes: [ + { + path: '/your-path', + name: 'Your navigation', + order: 101, + iconClass: 'fas fa-question-circle', + requiredPolicy: 'permission key here', + }, + { + path: '/your-path/child', + name: 'Your child navigation', + parentName: 'Your navigation', + order: 1, + requiredPolicy: 'permission key here', + }, + ] as ABP.Route[], // can be imported from @abp/ng.core + }, +} ``` -The `newRoute` will then be placed as a child of the parent route named `eIdentityRouteNames.IdentityManagement` and its url will be set as `'/identity/page'`. +The advantage of the second method is that you are not bound to the parent/child structure and use any paths you like. -The new route will be added like below: +After adding the `routes` property as described above, the navigation menu looks like this: -![navigation-menu-via-config-state](./images/navigation-menu-via-config-state.png) +![navigation-menu-via-app-routing](./images/navigation-menu-via-app-routing.png) -## How to Patch a Navigation Element +## How to Patch or Remove a Navigation Element -The `dispatchPatchRouteByName` method finds a route by its name and replaces its configuration in the store with the new configuration passed as the second parameter. +The `patch` method of `RoutesService` finds a route by its name and replaces its configuration with the new configuration passed as the second parameter. Similarly, `remove` method finds a route and removes it along with its children. ```js -// this.config is instance of ConfigStateService -// eIdentityRouteNames enum can be imported from @abp/ng.identity +// this.routes is instance of RoutesService +// eThemeSharedRouteNames enum can be imported from @abp/ng.theme.shared + +this.routes.add([ + { + path: '/dashboard', + name: '::Menu:Dashboard', + parentName: '::Menu:Home', + order: 1, + layout: eLayoutType.application, + }, +]) -const newRouteConfig: Partial = { +const newHomeRouteConfig: Partial = { iconClass: 'fas fa-home', - parentName: eIdentityRouteNames.Administration, + parentName: eThemeSharedRouteNames.Administration, order: 0, - children: [ - { - name: 'Dashboard', - path: 'dashboard', - }, - ], }; -this.config.dispatchPatchRouteByName('::Menu:Home', newRouteConfig); -// returns a state stream which emits after dispatch action is complete +const new DashboardRouteConfig: + +this.routes.patch('::Menu:Home', newHomeRouteConfig); +this.routes.remove('Your navigation', newHomeRouteConfig); ``` -* Moved the _Home_ navigation under the _Administration_ dropdown based on given `parentName`. -* Added an icon. -* Specified the order. -* Added a child route named _Dashboard_. +- Moved the _Home_ navigation under the _Administration_ dropdown based on given `parentName`. +- Added an icon to _Home_. +- Specified the order and made _Home_ the first item in list. +- Added a route named _Dashboard_ as a child of _Home_. +- Removed _Your navigation_ along with its child route. -After the patch above, navigation elements looks like below: +After the operations above, the new menu looks like below: ![navigation-menu-after-patching](./images/navigation-menu-after-patching.png) From 9ba6c9fa486360d31b75c391a3d94e523c7b67ef Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Mon, 29 Jun 2020 21:35:45 +0300 Subject: [PATCH 154/190] docs: use js for highlighting --- docs/en/UI/Angular/List-Service.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/en/UI/Angular/List-Service.md b/docs/en/UI/Angular/List-Service.md index 6d16b73ae8..900606d725 100644 --- a/docs/en/UI/Angular/List-Service.md +++ b/docs/en/UI/Angular/List-Service.md @@ -73,7 +73,7 @@ Bind `ListService` to ngx-datatable like this: You may use observables in combination with [AsyncPipe](https://angular.io/guide/observables-in-angular#async-pipe) of Angular instead. Here are some possibilities: -```ts +```js book$ = this.list.hookToQuery(query => this.bookService.getListByInput(query)); ``` @@ -95,7 +95,7 @@ You may use observables in combination with [AsyncPipe](https://angular.io/guide ...or... -```ts +```js @Select(BookState.getBooks) books$: Observable; @@ -127,7 +127,7 @@ You may use observables in combination with [AsyncPipe](https://angular.io/guide `ListService` exposes a `get` method to trigger a request with the current query. So, basically, whenever a create, update, or delete action resolves, you can call `this.list.get();` and it will call hooked stream creator again. -```ts +```js this.bookService.createByInput(form.value) .subscribe(() => { this.list.get(); @@ -138,7 +138,7 @@ You may use observables in combination with [AsyncPipe](https://angular.io/guide ...or... -```ts +```js this.store.dispatch(new DeleteBook(id)).subscribe(this.list.get); ``` From 6963aa73b3c762df40d16226ba92b4837d0c0075 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Mon, 29 Jun 2020 22:12:54 +0300 Subject: [PATCH 155/190] docs: fix patch/remove route example --- docs/en/UI/Angular/Modifying-the-Menu.md | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/docs/en/UI/Angular/Modifying-the-Menu.md b/docs/en/UI/Angular/Modifying-the-Menu.md index 95370b49bf..76298e1674 100644 --- a/docs/en/UI/Angular/Modifying-the-Menu.md +++ b/docs/en/UI/Angular/Modifying-the-Menu.md @@ -183,15 +183,13 @@ The `patch` method of `RoutesService` finds a route by its name and replaces its // this.routes is instance of RoutesService // eThemeSharedRouteNames enum can be imported from @abp/ng.theme.shared -this.routes.add([ - { - path: '/dashboard', - name: '::Menu:Dashboard', - parentName: '::Menu:Home', - order: 1, - layout: eLayoutType.application, - }, -]) +const dashboardRouteConfig: ABP.Route = { + path: '/dashboard', + name: '::Menu:Dashboard', + parentName: '::Menu:Home', + order: 1, + layout: eLayoutType.application, +}; const newHomeRouteConfig: Partial = { iconClass: 'fas fa-home', @@ -199,10 +197,9 @@ const newHomeRouteConfig: Partial = { order: 0, }; -const new DashboardRouteConfig: - +this.routes.add([dashboardRouteConfig]); this.routes.patch('::Menu:Home', newHomeRouteConfig); -this.routes.remove('Your navigation', newHomeRouteConfig); +this.routes.remove(['Your navigation']); ``` - Moved the _Home_ navigation under the _Administration_ dropdown based on given `parentName`. From 8a4fc89b5619dfe3f6f4e528d91daf6b3ecc0507 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 29 Jun 2020 22:28:09 +0300 Subject: [PATCH 156/190] chore: add deprecation comment to table.component --- .../theme-shared/src/lib/components/table/table.component.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/table/table.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/table/table.component.ts index dfe290d12f..2199411a1c 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/table/table.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/table/table.component.ts @@ -11,6 +11,10 @@ import { ViewEncapsulation, } from '@angular/core'; +/** + * + * @deprecated use ngx-datatale instead. + */ @Component({ selector: 'abp-table', templateUrl: 'table.component.html', From 8dfcececdf941880b67c0d19eb3fb63ca4a5ebf6 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Mon, 29 Jun 2020 22:38:50 +0300 Subject: [PATCH 157/190] docs: add migration guide from v2.x to v3.0 --- docs/en/UI/Angular/Migration-Guide-v3.md | 338 ++++++++++++++++++ .../images/table-of-packages-to-update.png | Bin 0 -> 155495 bytes docs/en/docs-nav.json | 4 + 3 files changed, 342 insertions(+) create mode 100644 docs/en/UI/Angular/Migration-Guide-v3.md create mode 100644 docs/en/UI/Angular/images/table-of-packages-to-update.png diff --git a/docs/en/UI/Angular/Migration-Guide-v3.md b/docs/en/UI/Angular/Migration-Guide-v3.md new file mode 100644 index 0000000000..e1929acd52 --- /dev/null +++ b/docs/en/UI/Angular/Migration-Guide-v3.md @@ -0,0 +1,338 @@ +# v2.9 to v3.0 Angular UI Migration Guide + +## What Changed in v3.0? + +### Angular 10 + +The new ABP Angular UI is based on Angular 10 and TypeScript 3.9, and we have dropped support for Angular 8. Nevertheless, ABP modules will keep working with Angular 9. Therefore, if your project is Angular 9, you do not need to update to Angular 10. The update is usually very easy though. + +#### What to Do When Migrating? + +Open a terminal at your root folder and run the following command: + +```sh +yarn ng update @angular/cli @angular/core --force +``` + +This will make the following modifications: + +- Update your package.json and install new packages +- Revise tsconfig.json files to create a "Solution Style" configuration +- Rename `browserlist` as `.browserlistrc` + +On the other hand, it would be better if you check which packages to update first with `yarn ng update` command alone. Angular will give you a list of packages to update. + +![Table of packages to update](./images/table-of-packages-to-update.png) + +When Angular reports the packages above, your command would look like this: + +```sh +yarn ng update @angular/cli @angular/core ng-zorro-antd --force +``` + +> If Angular complains about uncommited changes in your repo, you can either commit/stash them or add `--allow-dirty` parameter to the command. + + +### Config Modules + +In ABP v2.x, every lazy loaded module had a config module available via a separate package and module configuration was as follows: + +```ts +import { AccountConfigModule } from '@abp/ng.account.config'; + +@NgModule({ + imports: [ + // other imports + AccountConfigModule.forRoot({ redirectUrl: '/' }), + ], + // providers, declarations, and bootstrap +}) +export class AppModule {} +``` + +...and in app-routing.module.ts... + +```ts +const routes: Routes = [ + // other route configuration + { + path: 'account', + loadChildren: () => import( + './lazy-libs/account-wrapper.module' + ).then(m => m.AccountWrapperModule), + }, +]; +``` + +Although working, this had a few disadvantages: + +- Every module came in two independent packages, but in reality, those packages were interdependent. +- Configuring lazy loaded modules required a wrapper module. +- ABP Commercial had extensibility system and configuring extensible modules at the root module was increasing the bundle size. + +In ABP v3.0, we have introduced a secondary entry points for each config module as well as a new way to configure lazy loaded modules without the wrappers. Now, the module configuration looks like this: + +```ts +import { AccountConfigModule } from '@abp/ng.account/config'; + +@NgModule({ + imports: [ + // other imports + AccountConfigModule.forRoot(), + ], + // providers, declarations, and bootstrap +}) +export class AppModule {} +``` + +...and in app-routing.module.ts... + +```ts +const routes: Routes = [ + // other route configuration + { + path: 'account', + loadChildren: () => import('@abp/ng.account') + .then(m => m.AccountModule.forLazy({ redirectUrl: '/' })), + }, +]; +``` + +This change helped us reduce bundle size and build times substantially. We believe you will notice the difference in your apps. + +#### A Better Example + +AppModule: + +```ts +import { AccountConfigModule } from '@abp/ng.account/config'; +import { CoreModule } from '@abp/ng.core'; +import { IdentityConfigModule } from '@abp/ng.identity/config'; +import { SettingManagementConfigModule } from '@abp/ng.setting-management/config'; +import { TenantManagementConfigModule } from '@abp/ng.tenant-management/config'; +import { ThemeBasicModule } from '@abp/ng.theme.basic'; +import { ThemeSharedModule } from '@abp/ng.theme.shared'; +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { NgxsModule } from '@ngxs/store'; +import { environment } from '../environments/environment'; +import { AppRoutingModule } from './app-routing.module'; + +@NgModule({ + imports: [ + BrowserModule, + BrowserAnimationsModule, + AppRoutingModule, + CoreModule.forRoot({ + environment, + sendNullsAsQueryParam: false, + skipGetAppConfiguration: false, + }), + ThemeSharedModule.forRoot(), + AccountConfigModule.forRoot(), + IdentityConfigModule.forRoot(), + TenantManagementConfigModule.forRoot(), + SettingManagementConfigModule.forRoot(), + ThemeBasicModule.forRoot(), + NgxsModule.forRoot(), + ], + // providers, declarations, and bootstrap +}) +export class AppModule {} +``` + +AppRoutingModule: + +```ts +import { DynamicLayoutComponent } from '@abp/ng.core'; +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +const routes: Routes = [ + { + path: '', + component: DynamicLayoutComponent, + children: [ + { + path: '', + pathMatch: 'full', + loadChildren: () => import('./home/home.module') + .then(m => m.HomeModule), + }, + { + path: 'account', + loadChildren: () => import('@abp/ng.account') + .then(m => m.AccountModule.forLazy({ redirectUrl: '/' })), + }, + { + path: 'identity', + loadChildren: () => import('@abp/ng.identity') + .then(m => m.IdentityModule.forLazy()), + }, + { + path: 'tenant-management', + loadChildren: () => import('@abp/ng.tenant-management') + .then(m => m.TenantManagementModule.forLazy()), + }, + { + path: 'setting-management', + loadChildren: () => import('@abp/ng.setting-management') + .then(m => m.SettingManagementModule.forLazy()), + }, + ], + }, +]; + +@NgModule({ + imports: [RouterModule.forRoot(routes)], + exports: [RouterModule], +}) +export class AppRoutingModule {} +``` + +> You may have noticed that we used `DynamicLayoutComponent` at top level route component. We made this change in order to avoid unnecessary renders and flickering. It is not mandatory, but we recommend doing the same in your app routing. + +#### What to Do When Migrating? + +- Remove config packages from your project using `yarn remove`. +- Import config modules from secondary entry points (e.g. `@abp/ng.identity/config`). +- Call static `forRoot` method of all new config modules, even if a configuration is not passed. +- Import lazy ABP modules directly in app routing module (e.g. `() => import('@abp/ng.identity').then(...)`). +- Call static `forLazy` method of all lazy modules inside `then`, even if a configuration is not passed. +- [OPTIONAL] Add an empty parent route with `DynamicLayoutComponent` for better performance and UX. + + +### RoutesService + +In ABP v2.x, adding a route to the menu was done by one of two ways: + +- [Via `routes` Property in `AppRoutingModule`](https://docs.abp.io/en/abp/2.9.0/UI/Angular/Modifying-the-Menu#via-routes-property-in-approutingmodule) +- [Via ConfigState](https://docs.abp.io/en/abp/2.9.0/UI/Angular/Modifying-the-Menu#via-configstate) + +As of v3.0, we have changed how routes are added and modified. We are no longer storing routes in `ConfigState` (breaking change). Instead, there is a new service called `RoutesService` which is used for adding, patching, or removing menu items. Please check [the documentation](./Modifying-the-Menu.md) for details. + +#### What to Do When Migrating? + +- Check if you have ever used `ConfigState` or `ConfigStateService` to add any routes. If so, replace them with `add` method of `RoutesService`. +- Check if you have ever patched a route. If so, convert them to `patch` method of `RoutesService`. +- Double-check that you are using absolute paths and providing a `parentName` instead of `children` property for sub-menu items in `add` or `patch` method calls. + + +### NavItemsService + +In ABP v2.x, adding a navigation element was done [via LayoutStateService](https://docs.abp.io/en/abp/2.9.0/UI/Angular/Modifying-the-Menu#how-to-add-an-element-to-right-part-of-the-menu) + +As of v3.0, we have changed how navigation items are added and modified and previous method of doing so is no longer available (breaking change). Please check [the documentation](./Modifying-the-Menu.md) for details. + +#### What to Do When Migrating? + +- Replace all `dispatchAddNavigationElement` calls with `addItems` method of `NavItemsService`. + + +### ngx-datatable + +Until v3, we had been using a custom component, `abp-table`, as the default table. However, data grids are complicated components and implementing a fully-featured one requires considerable effort, which we are planning to put in to other features and issues. + +As of ABP v3, we have switched to a battle-tested, well-executed data grid: [ngx-datatable](https://github.com/swimlane/ngx-datatable). All ABP modules will come with ngx-datatable already implemented in them. `ThemeSharedModule` already exports `NgxDatatableModule`. So, if you install the package by running `yarn add @swimlane/ngx-datatable` in your terminal, it will be available for use in all modules of your app. + +Since `abp-table` is not dropped yet, modules previously built by ABP v2.x will not suddenly lose all their tables. Yet, they will look and feel different from built-in ABP v3 modules. Therefore, you will probably want to convert the tables in those modules to ngx-datatable. In order to decrease the amount of work required to convert an abp-table into ngx-datatable, we have modified the [ListService](./List-Service.md) to work well with ngx-datatable and [introduced](https://volosoft.com/blog/attribute-directives-to-avoid-repetition-in-angular-templates) two new directives: `NgxDatatableListDirective` and `NgxDatatableDefaultDirective`. + +The usage of those directives is rather simple: + +```ts +@Component({ + providers: [ListService], +}) +export class SomeComponent { + data$ = this.list.hookToQuery( + query => this.dataService.get(query) + ); + + constructor( + public readonly list: ListService, + public readonly dataService: SomeDataService, + ) {} +} +``` + +...and in component template... + +```html + + + +``` + +Once you bind the injected `ListService` instance through `NgxDatatableListDirective`, you no longer need to worry about pagination or sorting. Similarly, `NgxDatatableDefaultDirective` gets rid of several property bindings to make ngx-datatable fit our styles. + +#### A Better Example + +```html + + + + + + + + + + + + + + +
{%{{{ row.someOtherProp }}}%}
+
+
+
+``` + +#### What to Do When Migrating? + +- If you can, update your modules according to the example above. +- If you have to do that later and are planning to keep abp-table for a while, make sure you update your pagination according to the [breaking change described here](./List-Service.md). + +**Important Note:** The `abp-table` is not removed, but is deprecated and will be removed in the future. Please consider switching to ngx-datatable. + + +## What's Next? + +* [Service Proxies](./Service-Proxies.md) + diff --git a/docs/en/UI/Angular/images/table-of-packages-to-update.png b/docs/en/UI/Angular/images/table-of-packages-to-update.png new file mode 100644 index 0000000000000000000000000000000000000000..fc492d374045e6fb522fd2e7027406655822c36d GIT binary patch literal 155495 zcmeFZWmuGN*FHLQgGxyw2#A!lG>RgP(jC$aT|LRmqZ*L^)8CQ^#qN3dW`65&mF(X z5izp7r+6lv&-nNO-oyC&r0+h`8EUmwg+EFlHzao+8Y7RcVqAKwPv&FH`TY^%ZEHw( zN_1dx^M2D=bKSvuZxa7{YVV8~MxY9gF>B9DceKv9wVvgl!MdbsYP#7tARLWAGz#f6 z^bem&X=t!asO+wFjf~Mg<~MD8D?hTo4&XX}9`hUoip3U@`F>~RnFBhAhoW=k40J~( zW5(ONS?TxNPHdMA#ueSi{b~m;8?d@{vEFf7ze1sz zYv;XY!jkR)xdcl0Qa)D+6ldab%nw_C<`H<#*D3a(g1@;m>4*eHC3AdsQTRZsL-2Ly zgL@x16Q!1~mHMu^z3RGKMYc?GKCRw$&ObFJE?HHI(BLI`QA(zv%ZafvSNQ1}y=eQ4faRUK z>?f&K{K2q0kLv=J>z1djWL8u9Nd5WcBYZr~j>xJ{*`Ja<%f!kr7M}J^(Ca!B$}+Hp zyR>P#aCEYUz4PqT@l}#ENVP?I#&b#uJwvjkrS&n;6ddF5fZhZWJYU#W|Cx-I`_7Kh z22s2d(lRPx8c4FjNboT*T$b-ClUK$o{PevH+zTvuOfs3}cR1cJGeF%^#PVaRl+hxC z`cIxP;fTLa#bJ8JeNjYvpM@@&3r{@oUYBqMK}JbkY5sZh7w3$J3e0barz|!JZSTo^ zdhiSP?fs#(XZ)=5}O;va0y~lTdi3Me3&%5akR;e_JcYVsF~(?y=LNFzAuv5^dN*cq;htQ88IO z-{*TToKL;8tK+KIqscX8TY96W#y@8kx`cW+r=_D_rhO=lxX>fje~;|YD>Iv5-@2nk zqBHTP5KSzcPHS(F+WSdq2)0!?%`O|xRE#e_gE2qsaUA|Q^*Hx9NwQ=#&*NTg`zPBP zlZ15-6;lV6ev|}${2hlc8);HkS6_#oai06#Se+*cV;=v#*Lg)@Ejj4=>($kjOuEIJ z4vqy&NkP)GY-hI-FUj|Qv+JC<-)!-zJGjlCfE2J&>XcCV$GER;jxinCkENTN8gUD>0hi%_UX9 zU44&ykMW+=N!b0K5$UHFtV3xVL=ZE4-jt_tweM?VYC|Vp*s;yA9mmQ&G>hf$N+*+9 zirbfG$#&14&Cbdu$W|HFFQ=G%w;O+UyWr=sbA*djoSV3wZ*DR@P6kVey*md*rU+%3f!3R0-UDx0d7?F}+EJOpdOWf` zs*a!LxSQ0yqmJayJV+rK2_uB8l5vu(Qc8rR-p*OHmg1I1>l9W$wcUGf z(YaLWqDx*#p%s;rXYoE~*d^Q|#UlMnljb+gvN8ICX}AWs+CBHk7Ga5?ry)pj7OJqb zwR4zIvzx4bJ6%;>RPDI6g^Wcu*A&$F*g2XHRPdCSl(no%LvY=`uDxD$>WbOu^yqb- z+3=jhbKiHnC#ES1b(MuSrLy$XK&M~bkv;t!9r>NwdF;d5PiJx!oh93$Zj5*}`Q8|_0pGpRF}4qqG+XEwJ@w_RsxX3~A0 z`g{}@@-jFu_l!Kan5&pP$V#k9oGE}8^h~#l&H4nNXjY?%B{aSF8xCC{-Qpi#j~);+ z=9%}M_iGM7)t#=MBKLj7+xA+KTgT-pQ}7qE7jNj-02Qjhy~>f9tm!=YwLVTBf?Df~FFS zX^Z@ADNML`WA1V=74P?Yq8ka8SQVa3Oq%I4*~IL{AeeVvioEQ~qVC9CZjaO#+}5hJ zuN0`4#QwGWR_pgnWK|TD0yXWqbULy3WtpKpA~J=1oOA&_;CC*{NVQm9}JlS zh7^Xfl&*WfBt=zRRA^baf5P~^y5xYTU2e25F2>~JdYqE_HI+`}vaYMnXTQ^H(+el( ze3;gzN8=#xgZi{ZKXA@<2+Z4nbB{WiSEtE8zK#9%U>-z2H}IG)ex7}Y0+URGq7j-V z;1`f-lv%mEMF^t`w-SGh&v9Mt=X8Z>?ih;c!+@g7}T#(Z<%^o;0a9-3t+>`9Q;C zhd-s!FlpyHxppF@;NMuy;;U%*#ZdE1YYG0Yh@^(a9(?)fQvJvy4rwthwH>{^F+o*R zku%j$@13|=Y$0eJQJxEiOl==XgKRI$E_rBF=OKu+ z?GRk7>KJz|k!pG4l(nEgSUXDail{=@_Ir=-v07JPgb$(t@227{3Vu^(MYY zB4$`Y$3Ja_N$7`63q7H&B(H$L6Y+m4{Ku{T>GEGyHC-)SWE|~* znr@Q+qxFAR{y%U2KP&#zr|$psDg1x$^8dK=@0#K~H=_R^s`!_l|0x9&Er~DA^WT#u ziNEK7Zw$;Mt<4Kn4d5GCWj8N07vSU3zrKNMG_Kk+gUV+hkTgjC#WM|0w5?g3ucVrk zfs1X!KCisVU%$u>##JK|dyG%P`TgSYaR~WcnnyyMj6yH&YG}N8R>qj|5ufR$=*Po3 zALG*U{Rp)QBmzH-x+o;FKwFaECH)ENj$rxz2)xIfX+)=lGgDACXdolPw={~|gF5KRR8 zFRDYsTw;<2iE-l-RzDhMl1fi?(*<&1PSUkGE{uXfG^WX{))D5H1-; z8B9qA@z?t+UCcWH0vfWPsiE5l+M~(WR!KGU*U^PKb&qEg2heXjuK7xUGo=?bS89Q4 z{t>t&G__>;&l5yCflTfc+t-aW-wN@1y;*{gpm;9O8$H`>ir}OX8^R zbbbcTPyXeGpF$7*Q!gE%(m!!B9Fc;GtdW1XTv`3@4Tj)0Bk%RfRzj9&^U6E9J57Cj+`e2{kPq}^Gma>zgs*+HsWOQC?Bk^I_# z0Y_Yb5tASyJ|SUUI}u+qyz83?Vs#lUKs3m6=kuiN!!FGlf%xn#`TZf9xQ8i|SGkr= zR%ymG5XE?CF9xt+Lvm3J%tfjA`4U` z-TrhoJKti>d>gmQx(%eY&gJdcW3@`TyKykjEKc3(=k2Peg0rp^HDcEWBAFWUXUCzu z<(9~LvT66ZN&9Tyx^h0tnSpY<-wKe%0I7rZ9yY5Q_@y1AevN&cbBj_u`$%rX2o7RU zfF`l3;dQ=d5hqI+c^sEz^Jc(6ETXvnxyyP#xe(T?{#23GRH345kD|C7yG>H_j()?) zk(HL*F5un0*!C)_L9|LWrk&_dU5ZoJhjp>pWi}d|E z+fnM0qeOyN=(in2a!9XVyriD?$+K0k9+47nvq_BjzIjV{>JR6zm}{ci#Z(gWlm1Jz zET3dA0bB{IDcdAI(>zkQ6O~f4X`{NF+33LJh1CMGFWMm)P^rr1+jz zarXMhof6u_ie=4#pO`i_XEqf!oi=}~m{jPWr0uV9@W@5dil8SvaqTzQywWHMG_78r zsnAm#=N8WX+7W47~`zxo0z4?y6 zSZ1H&z%xPX%X9r5Y{CkOJS0qo@-fb#ykLHh`YeOTJCujl+&G<>hXRbd zraqXy7U5wtwnSJXWe|F0z1yGBiWX-*Sht=e(~nCNyiPG)9Z#@%c-C znucHwY=Q+JiJp65veDyVLkpQDTr*Rvc_+%yGAFucG3tN(q4$=?f(GaMyJr zOAN~1jWl`p=}kJqcesorFWN^1(l>~Q^`>Oz=oUsh;d)~gYyENV2)J0)Pt{`Gwj_t? zYNQLYucq!`FzEJU|DGhs&n1i4Wi3ZSc`7uuc)wb?$NUhdrVCCK6!a8=KJq5ZjmztB zX+6iO`P=qF6V9>R{7zZ|dw3M~ubG%@cWcql4e7Sa*_FGI`cHkJc==Zgm|;zAW=IET z2lu)HE3g%>ArIB#6y-mJ`js9BKZeG|ng$>!quk5pnMfC-l7@=BN`yuS=Gx0NpM{3N z_y==dZCDxZ&j^&LBk2ua)%VbgAIlCIOk97}pq+KR>ZaQ!l1BVsXi4SRX>$9e26jHV zJjG`>Y>tkrUrtV72ZI|3!ZO;hGu$bNbeebn(5UF)AbHekO9`oW>(v`{!M$?_P7u1S zg!MGv8F}{1XOjrWIvI~`QQMUG_=o9!PoIp9l5PJSp12DJ>1k)7&PH8%M1#zc;~7Yl zV>2rj0a&)sm!RJS)(ppKb=EJq@~4}^$9|7}mZiHXmr=CX0?HtSXTYeT)oSq>;T z-C$sUZ&I(*<_74M_BjzQu0aFo(5-WrhY8GKQL@)Qd5mj`pJBI_{nnDL{YJXvCTqB5 zZXvlHn?iTOL*Z1fPy>w}e6dciOJ}&87kDcit?fdBEnQ2G-h0uY%lJu+m;w!}Z|Q-P zZk>6!7$=;#FY98D$M6N1BgsrvHA1~geR7Pg9OE$95qitAui$8W(E#d+z7p!hAM< z)MUSIeaCm+k#7FOCs^&X)h)XxP#IG+}n8$n4ZppCz1ql<>gx z&;w%*vJ$2!U`u&zC>2_=K0lQ(F6DYQcs` z8ce(a+rDV$9`E*Z#CePIOj~i`p zX>w@eix|N&Zwuhf>4TOZgP`&8hI)_OSmvWP!VamU-wHFpXpHO*)Xt{K7}WC z^9-~EB*lg5qL%LlR(rveSGDWl0s@{3(&g5>DD@HP%;sjet3ep;C`%7n{8d{Nrq9mS z?x#ZICK=%Yt}@Jw9*sv^n7@PzCm$SK86mhw^f5$rK%!Od^}t!dT=m1QmNAd0SC*PE z(&Ru*i5e*y_1oWe!3g6tx#nyi>>yXhvuM{u`YQHa8}`?x0~|z}y^D<0`AS8rEHB|L zu{$Fv9<4Ci#_*RvJznD{agAr;b&UbnqH_M%)lt(7g;~~DOZ##S>)GC$akE1lLR>LE zlA^KtlXUm9v)Yu8a+Z~eQW;C>=r}1W=qQokSUkRfedE%zqIK5J+BXMK+EJ222Qc;A z$RP~|hMM_?cVp{9zr9qnL__4-<=9>xRoD|Mb#9=t-)Kix`8Gt}6*ziAmxu*JIw*zrwGs zwAurPW>;R#fpKy?$7Tkg`ZL^<%6&Ha0;e+wM5y`Yah9MD@+m4`FtFjINm?N1J(r%? zS&FJ<_p3|R$!DAAQ&xi(YB`p8NshL(QqI$IUMo2V+5Qz_<<{HYURwdLXwWM;xU};= z9$v1Y4)G2lwcTc_wteaj|HxD0{yPx|SW2|dRGF|cN?Ohp zHYcu@GBy?65|^n0)A-!$#b?)ZaLto$Ls%I3@gMqv&I44Hzogb3G*qLG?Gkrz<{uO! zDmjN@AvT;h71c^yNFf^gndVdii$qisX0>9RI-x?6rz z@=>Pi23m?&<3)9G{>#+r%V%xr4)Kj=F5O~&{$J9Y(-Pm3d+o2qx0*S+g-Cf`QkL5d ztp(cj@95||G?pasbLs?&a*PJj3oN*^ziF&3G^)^YXj(@be-%7%X|&0_+8ys4(sVua znu_e(&u|!;(WnX%a6;AQ`uT90dp?XG=)sI!(f7HLTxo#`!8TrY+>F8CS~ZE7Q+} z_fLZY+@!CYAZ}kO^s1w|^lQ40YG&>N28rHpfqt?IT=V(VvhpUh{_Tl<>ru%aw9Eu* z0;9aCE?bMro!z^We`MAQf(#!T^Lib?B=>tR7-W=A=z516STUMZc~>*%wC?B%;wbjMY747 zoeXO(8!la-{cI;wstc6>wx@qyUAU|WyR?c}DW-{g{bC?IR;7`@K2Vi-082F(!Sg1$ z^8D&+fu1*(uXVSm)c}#5y#4J0QHiz@%qqO!Q*x5{DL}~sHYQz){l3cgcvX9U2o_Y8 zn(kSfB4GP^KzBXb)cEVv%)CO?<1bKm+rcS{YtbsLLrNKJ5y|W1z_ZJ!<7oWVZiRIf zZIPbo21v`$j^8h&6llsK;)T%Ro!#O!C{{qpHa@iTrBwC%FZShSZqvIWEbRkbDMBrQ7Y z7G80^{le|mMXC_=ohKgY8=;BlN@m|jRY0mP{HB=3=UqC4I>Pu?~>=MeN8p z<)SrR*ENMGt8@~oLmlPE0RD$58l3A$VDq&7f7tob>ekK=jPM;p^> zOic5`0m=H%W+zuEq8~-zysB7vB_GznQGIPbt)EYR~>4Pb}7=VmxG50pEuII4Pc`O5A7N3gNwX+fr8s zkhYOu@gl6lhYUO-$ zq*z?v??v?WQLs-V+6K7Zt#6^KLiAQb;TtKy7eMtx`i_8*K!k{x;!(VQH{g{OLfWRF zE*%yORue+BB^=#0F8Bc=hZsYR0|n!SUy#!^ig(q;YSljMJNyZ~n}`pLE=BmcF5 z{8WTnH8&7rrq0&qXyj?U5!g8hiJ-CA++XE8UN^Q_FE-q4tlpr6iKGwM!8PDT^NjOX zPgu{fc-d|-ryz8yM*uH`QKn0N>s?&N=q~{CW0eC*@%tNX#rGOmlGtx69^WF#&Ga*J z;N1!ASJ)9k{f)md&$z*Fe_3kYrevT@TI(L5k1uof$K{s-{i!&fwdWh3ZDOkiYku< z#4J2?s3`fHoY?q)rljq(KHL@n0%hhbfS9_QvzEp(_+*cDUK@FBQ+36O)$sR~lXGOF zMw(<)7Mh`!g-#m za@XzpvTJ7yE{1NSxy|6&FnGbsswM_pvUR_-HqmH@hu^Y~ z_`d9I@Ei#JF~GwuGxiXe_arFKAx`q+AM5_CnkaWKFbL?Oa|rNu9~DDtc>O60eK}5* zZ#P%2>9FB#6~=f7_Vbn>d;CSFZ;deEvIt@USkE>UQe>xrh-){Dp^-zRub{>nbe{OB z#Rq37;x^s*jKT#x~k?O8=KIH1E@DBFm@^3U)K@ENPgeOrepGG_9Sk->%G6jUi>WmEDJ6~3ObbOltibW`lk*lw;;AIoJwA|O1H5av@(sob9pI4@OoI0pycJ3L zuQd3f2^cuUouLdQ2az82f;oXI+JNt*R^}@*SqDzEo2Zq)I)jucog$;i*zX8f>(;2) zTg_qMkaUO2NRb=LhV!c=Qow`-t90U0&nl1eYf{I`KWLosNY{3)oYC?A(eE;~ZLGHT zsIRme>c#t`e15=l=FqFNW5)}bcbgTAjdy!E)@D3n`P9psL-P^Odg_>-!2No_OmVg|!1qQs%RZI{W&qj0L%VZZHJki zYtz-*bKXc6cJ18HBPBum{WWv!42@%|`)d;SURRR#C)G&PZ+caR6w=ZEgY?x`*hWkM z6iR%9W5aK{Tsj@8UZ3>$Al0dlOwV0H)EilD6m&n}WjJiConel5;57uVu+_)Uo zYbj|OoSvdI249D52BM zHIUQ(xqv@-_>0S}n9F%&~ zj9*Wpa0wx5SEA;cM7^Q*MA2{d3T~B5oduyU;{6l3>weK-o;QPXfrSK*3eOlH~tApnN4n;`%wsQpR2X0h-deE2Nhp9N|NO1Nmqwq5r$WH05GB6tR8_r z*a#KA{i=jA>NHy$B${=6007c;QcRpeJL3{*CyHQF@asv6zC1fH42;}dg9-DtP8ma! zcSMyNF$O)v4h7lS<%#J;SLhzLh59dyejg9Iq8^;XyF4&*wZN(Svwyt(a8nmUZ(Oif zK-?N^T(Bpn-gZ7W?dU%K3N)3IamzNB{=pUt>_uS|eboCJ2{aIB>TG_bDx>N_lLp@i8vd`70Ct|$8%R!w0Ky4HgOQO#Ru4DL< z1%TLwV1p6n7EoW)n<~+*3KVMb;6A$CQS520t!xI1)zh zwWuiB!v!K*me*2N8mp~DM)FM)#kOMr;_m?n$|}Kno5_`%0J%klGDHK+V8c!Z_G`iD z{G5Ri)u&$2s%hi6O1}nz7p~0H-`Hsc+=IE8C9ht)taL6O=28Tv0kq-f$cej^o-%a7 z-b6*+$@(!S*A?h+gQ2}MFo@ylvcT!Y&Z?wJ&6V!%0MjP?(i)!-@`8+R4pb>R<8|Gp zvY=17+PB%@*FjvDtEg>7v`H1%|MBuLcX*J_bD@mQeDPZV)Xxh*JRGj9?00tpAae*p zk|VY(jKTGkAKN*so(9!Qn`9~35rqB+mr?8?h`?dC_}G4EaXc##ja>h=zg!uqE&YLt z@N6fC@0CkoV@SaF(w%kPqW*^M)vO3?`p{Lj}LGMgBpZ z{MKfk4Z&`*p}Ihu4c%$z$u_e7)4V!0n1XF(|LGxUb~`L9$POB?Qu@H5lv@L&=PC_p zYz{Ys9*8c*wK~`m1`LXs{KUQS$$_AouXSH|hQ%8Hp7P6YH*ojoDOI8$#0-3$?$>hy zD--i8nBz;zHZcj6WK`sV@KFZH%<%8g7Xv$Xu#+e_AN|$QqZ6Iu$ewhb^pOdZtn;Ip z%cIC~29va{%XcW|V2FXhY>D{EXN?lAu_R5JCbuYiR2mNeH%fP&=q0akO|VMH8D@2CrKR) z&aSJ?mit5{232}EIHQ5Y)L)6z5mUO-@d1r!*7omrKWIl`XAIa*{!}i?ILn-;5}43c z^d1ZB@4WOanJ;j8o)_DHJe}NswVZ*Fm{lX{wR{0OFLOBQ+GItBwQTGOxE>p(?gs!k%ZO?ZZ|D|Lly_<(Rt;g+P1gSqwce-TlG4f(CSh|6+s$wygzcQxGjBU0Ktb;T_DcVxU2#BhHHDHX?3Ws+ z%6-;E%(}DVABUQta1{OQhdNdaML1LfT!{|)AR58`q33u~Owgngn)SdMmK*C^(A0Gr z!g+A@9K5nb(C>Q8_0{W#%Jn$u4ybZoOS?cYT(If`wr7=?#$K+{kj>!)d}dij^3tI4 zZvP>-@VpZgkqEaa(Wz5#Xt~a;ROxrS%?s9*X3WGG1egLPQTN6fzm&?w7BOYpV7?qx zr;y31(rwJ#HX1@!5b}%2Fp?yen0o({ugE?PYx3nt<;1rL`MJwMGY29cF>$Vc zfP)JCn)p~2g{MT0{+CEdxjpKbtm0mv%Cn!K|6H7)phuYZME^m&hB7j_Nc~YVdII1- zxvTeiZ7UlA=v8dW>j<6C~tN7uK69BdAuH4)|Jm9Ijv_TG5a-7T!37WVl zx42wqNuY<=s8+B>ti}>VjWV7@aq4A%L@`H2PM12zowdBl9Z2O$_utD2a5=v%Yp1+a z`Z-RRTB? zy&gvqHQD$5HA8z=k~t!Ck%M>wQZTesBF!B{YISGGXT29#M~#L7vDIv5^nW! zbkc_PaRPFlT>N1eFTa~^OP#79#*~SnEr$*tBu)=hj>7Mv( zi+k0pc2f`Qh3kRUQHnsGMt3Bg*k!QHF=-&Nd>ig9qN1hWB*!4q^z_p<_r5#Uyzoys zgo$5wgV{sCMC${gg!tb#3rTH$>|J%FMN_74vWvK^IIZ>MqiwJ;2v+?<&=s*b+=Xn- zuuEN^r%ZQd5f5;pZDeOZJnLSOKZXa6BT+ZN;9^HxCI8EzO~LPJ34CuyYgnN@9cXc) z9mB778al%1&U${$ujY)Srj1U<7y>ExD(e9EF*}$VP80; zLMsnUF3I1#N@?4hnS;}9p)M-azIpNvr4CkG2fydH8YpW*E1|C3KHCU(Sa3Q?li;&E z)mAa{0h~C-I+r!KT;qSNe-lh>$82^xZiGhI?Of0aviD`Ye)*@nHJ5G?SHa71cZ>CF zEG2peC>p8k1gSEywc$$u)6RwrY^yctX+k1WgdAgTXn6bS%J>3q#~tF9&Ep0r?GMof z9VBe_E1I8iJP`R!8Lf{s_@OZ?MG0-KE7vVC>>x=f0^xg5F+=u5tT~J|7SKFt~t>SK~Us424-!s2Lksh^&2>u zuB4%BllWx)1*yrHK_iED5wWmt0v#-<+g6jK=iP_!ci0*goSz*#s^CXmg5b_Sg5aB| zuemI#q(*0m2{4#ye2%R@duyES?%on*{cvWv@p$dsc4Gup~Ibaa9!zfJnKWe$`v zE@J}W^en)1xs13&)gB?Is`Tl%_Oh*+?a2O81r%h)0gQAb{|iUg%k^{)7Dckehj9Ur zkpwP2t8L#i)2&mpg089C4#$7MD}$i-gwhTAsyMeO;UB@IbIAcT%x0ci=r%t1278jT z17M<0mse#+x0zU=?0=j1pC$7DlP-dmSwV*7FYs*q)~IfnJSr*Ew{KfG>?Hm&%}%tq zH@tqig@R(inpI~ta(Z=|p`8{8`1WcDL|oV6J=W8iLy74UZg}dhuCC4cxT8O*k2N1_ z$5$cXJv(u*Y(%;4{o7lA!5zJewz2d(tQ**gazO0BVm#Lv>$?$+Ctd9NF8cbSVFFW( z9Lwc{PB=wgJ;WMfi1hq`RF-R$G}2&$Cg9!t~Pm)f1W z8+)%Rv1%?-rBxK|Q`EYS*K+*;z}tyLh?x0Q08F)Aw}SQ7y~GzR{S!Mw5GoU@I4v)9 z;5dKf2jrKE<{6ZI+nQ_`KQpd$GVKDm$IrBvOSS3LN-G&2~f4yms zBc6keD_QVM+uA&UfyCT+y|Bo{9)Nl^AC7N%fiX(nlNc9}$f;aYqj8{=$gQaWFE-v8 z&F@c_O4lgS(^N>{d;qW$ca+b{Yz`7i5gZz&85#v@x?yDOoFe5`iAXU>cLJBbMcHJ3 z@a9)i5g_*eld7gz&SDVonW;*jUoeig`^M`LF*>S zyyT>5Y67PrcS;TBd78%`_E-t_hKgPVat^sUaj#T{hi-a~B2Ei|y~$z&Vx7qTFC4H` zjjVbyF0~f`ug5Z7vlC5Tp!LRej{Mv0p~ME}Jt0sLS{uOfIlqf&Yq@Hl^l=11uBUB0BweK!rGvg}XdsF1-F1^CtlOsy(-bqlSeuMUtW^=O&(;_(z6 znBCxew1KCCz7;P+fTZ~ErJrN6$J^`p73s=;sJ!WuP`rH}LyG$=RU9_9#}#3Cj5yP( zV#?n^ZV{vf@|X4Q583r&p+Ne=(Nxv`K}kzpTk*E1?!?gqo*-QhtnJl=(Mgr%5oykx z4Gh~b9eX<9zL?}JjiQ^j%I&9WN8QcJs1kCRh8LyQ0Et-v@klWb%+bKe4wNNEh0pPJ zjCgKt5w=d1{_^iB&^L;rn9DKY`7VHgM;B_v?sZ?dxtFa&fBa_rCB=fNk6Quvi-oze){Qj_JK7urTzUkH5Dd7=%SxCqKI0Q zE@n5^Zin%4U$91(qFF0Ha6bD@DZ)-lOeeXLZS`F%r#$5yGhaxhvOVBZ9-)znUu}1! z&s+>!D5Nt2xG97}!0O8P%m#4M$$YRez1cj$3s@ zk*;OeJ(g7J{x)T5%FAaz68Mva5){ZEKW)-;)dRm)zwMj=%s$^gv9p6M5nPL_-)aA9 zY8F2A+jWiS1}u|*BQ_4O69qu_gXH3y`D;d>lWhW>QSwB?w=R#@<=%j`g7dYFJo5OF z6UMAx^;&7r*9a1cnE{Z*dzcy6L%KzV#Z~D|IkRW$qJr-!c?@m$?N!}h*+_13Tul$~ zE(gRA(FoTsS2EA|+y03NIr4XZJuplKa=rK@v_qlRJj0C%UY;ORUSv$-a zIW~$unE5Vy?uT7=t4V`nOmlmAzgbzjkY|g{fhBBF>iR0A{78k;2A`P5uPqaD>@k4BdN*r`za*;fdUFHUZbj73%&tu_!yG>~$E?Ck|5 zKGkSd&0c$AXT-(DwXJ!k@%e>t8dlFZ;QxiJi#rLJww zsYQOOS_WrlsyV&Kk6i;&47i&%(5)7yYUkFt^wG66fFzf?h13eD=~ep~I_u{QwjuPv z^(qO)u%y(vOlm4Z3k1ujYV1mSp7S=WzdQ>$tbGHL0FEVzHSG;L$@m5%EP`e|Gwggb{B(ST)8m8451N`e2W-6fV1nwr@SQ!N5oExL) z;}-rB=VCXhK_2xiknI_ln~i^Y<(^xePR%)JX`AmLS=tA6jgHJ}Mm_V` zn%RsTA)XxvXv6`kHDjxk1g>niJhk$%Q5^!$jNj)YMW?%lxCd9wlgwxc`)Fx>XkY-L^_Isj6-em{%-bg*0sqaA} zKW3(m5Ee5$EwazzToOjnD;8}xs~sVkD}8aVVoB&?KU{OVpsxZ+p|R9#TBJm!Q%fYh zQ;RXpw!~XEfmW}O&z$c~@=gP;;rxg7YIpRXqJu5{qsJ9yD8+|Xk+ghPSLncTW(TR8 zGQ~h%IRjpoKc$tTD58EnelI_yGP0uQ zsoQC^@A+?BI|;2j}X)BjHcMY4C9BJIh}tnu+uV#LfvL z&(@8TRVi9}-Qe4a>C-|F_&bvoY@-kF5~*@Mq2UG@=BT|CX>!gYLx^#PuAayTbWK1x|gRoMoshiW`9Rz>VNO2v?6*VLVl?}DN*xvZEj&tI%@myV#K7FW0>#loA0Chzx?)ii-=85_=aI%PGAeq2gQg8kw z2ikh5i|K~L=hApxt2g$!TWX>Fy$pmN*s^Eq+0S2phN`X$;%4dAqsdO&^|%EoGR zVP{b$l*K1hBpA~KRwITCy1H1u7qqHy zExIsIdwug83*3YbsmC_vG@fKu?(L5F;U1saX5kk28)R-;I0q1YiNqO^(4_o|W zcB?9J{$jL^POlN6Q21vD6EzL%L3LM3u)@bfPCfow&$4eWfWOqiR%I~_s>GhEN^r%C z3u9vUiM5+7*Ytq#LO&H(04Zv@*xoK-0(5yrQUO=Ku>+V{0BRmTmHnV&{fS6EkmO|7 zZp9z*U^}|W=j21G)+_7&t#2>Go(gUP#~{lzWQ%c^R_k-jt=iA#cACM=aMvcFcw|Cd zCKhd5%IltRnEo82oSJOxka128IO;{lN6*J9X~iJO*ceu;qcZL}&>;_LfD}BX?N)pg z@I9VkMHYbEEd5Cyr^w=_B+25QAg9^HlrnT()z=3S2k?>+9$@799w}@0lsh8o%;8R; zSy_NUctO)V;zkREKJhja39xJq1qBf4eVF(4paTGp z+a5gscr$p7Mpk zjsFEu3i1SUiXvg$J+glpV|gi{Crs}HeW;efc4K9^1{YLS%YKGq7KbZ3DZGYlkiInU zUz1>7D6J&|vHWt`JCPMy^{+gs=u`9>1D!Xbsk*WXWZf(kiQCco#!wcYV-~in$TA!t zf9y3n9#tUyzO_W2dX7nQCJ7yd$j(q#xyOMd)u}X{jYh>s{+&O{K7G4VBaNwM5{utj zi&%`ex3(=g4IA{6XAc^t)00HonLL~y>~)Hgou>TLk%FkMoI`R$;99L&CEOV zy=(q~S?jJOE6L40_niIgz0cmy-Wd&W(;coFio1GnqJ6{o8#Hk`b^c2Ph?A0~OZ}4a zO8lqUj`-Kci#LwzlT^g?exn?!J)T6QPpx1Lts{<&!rENVbu26ue|`DM@$q;o>HX&N zD45J{u2bfCI0>{4H_m?heu56JpH9vD>qQ@$P5LnvFh9d4%Zk{($J4&PS0O6+d`;c| zBDP-vDk#t`|0q|g5Bci60lF75uqSO$_|D>@)sTY$)uF>M$hl_Fg^8YZx2tNL08d7b zmhH6w7owgUwbIVGGiwWxYD!NzQ>umtB6&$)9!2ws@b2M;Nn(i$}rn8-6fn zcuev<>)wtA!w~NzX*2n3Tq3k4#T5vn_!sMo7Wg+liJPnI_{^Wl`G|>11mLn7T_=`W zX?HAfayXyOGcA>v=qLg8_zlsj|4!=dE!DdJg1!72nQq(h>LDEbPK`-iKpJ>4>UFb> z)O4;=2bT7JEOOt=>@l$A~`>6+U?TLVYI|E}Sma)vCm8g3U-R~y^&4bR=+>U55T82>86*XltTC#wh1Pz6ki2%{Wk{9v8!qR zbP`I9A9=Pe*~#`1tkPPeE=EH8&m+w1_Y#X-cIkaLrQV0jZq#0K?F;SyobDTK&8_GO zap@U4RTWiVCyMquj0-|0jJkIpI&_cPivHS4&$pCax-o?WU=Z5t$MVq1DQn%<-P$jNk>Ty>G9bC9y%oXB(W^<&Mw#L|s$<70QpU$qtlpg;o5g&D9 z5Ve{T+EO+3m4CW-f2pfss>a~wTqW^l)S5c{N5}|Eoq61;C(D7)507q#Qb50BaN*HJ5mv;lu69#B#jtS%ejA3sPTie3>i_ z=(tu$Pq~dJK-)M9^qJc8&OO}9G8v1uNN90UxiEKi7J#^KaS>KcS~b$+63tBBskF~qMN?$}3LyJ+_x*0kI}Bh>fp4WR!J-<%_@al!Yuc1Pw4$1Q-5a`^K$QiRuH58NabGJ9E?xF= z;cU`8HgSowgS9@H+8VyLma26=j{(TSMmRK~3>YIuV7|D%dXnb0)lefvqt+<kwqXvxIL9OrqN8$jIMf^2CzYTOw4N$NY>~k>!gztI^rx?>fkY0ObOdxOYt}S zKq*hQpp1-mU1!@Xsd`n-R!u@7za=E`VIlv``~?Ii9Vz;27}x(nwAbD@a>tfOJlC|h zMB^DdXGV@XKpGT^+p*Pvg@F9Vi(2DX~@HV*`p^8 zeLeW7BiC{sC)O(^Lcz<8rX0rh?K=w$xWlg6On?KN}Hd-==lpWmKH)eTbB zP4bzvXoQ>t6k}9t6>BD46=hD0yM6?T&mJFd#VYp5jn6xWc(zQKEs@2KJ5MIrQ%@Z_th2kW;TUSSIu@@8bbrJ+!7G5Gr*a1TgyUDX}*YynIQoTXt z_k8F(X1nEjM{m0@efH{sRDK!ZWUPj-9YQOZl-RZ?4MbpNBfvVj;nPdM z2HF~e!e!G*>>T}RQ{h7T__8IV8gi;Er*{4#XXkAGc;iP)<9I5u2?Styw4S1q2(U3X ze7v=H+AiC2l|BP^tkY4vQ7~-=xRYnnk~D1Is(707fDi6dvYhF(ROdF?@1d15bJEh< zd%SXQI)`mVBZGMiG3Dbq>|Fz4p$FHF-%`Nd*>M;iW!pi+{o~cuCsSi3n=I{)O94_e zCe7g!fyKlp`g?ER_kpOoechiXtm-`8YA}+8BebT_+h$G6_|9pWyPNGxt$PKNNnnfY z5X?enDB$aBXqQEsxkCavby#L-xL<1hiDx%(;mdLGX)QcZCUs`-Ph2NtX3qhm={&wC zfw{gMS~{pw6ZC}CDc8B22K1R0b&yRl{`@iwZlMnhF0Bx)dv9)Fk`15&TZZgqZwT4- z8Xzkd57iRUbi;I$h+lMv;hIrk`V(r38J3-k&IW%I)4JUEJD9;obHEAp%8ThuX?+#X zH`ym!u>)pN_|Pc(-pzLx1kGafqTcc+p?F0pFvc{zcQvf$t|YzG5xM9Ua$}q>5yC9e z%L#73<@4x7Cp#^K>i*uESK+Uby5Y}2ErAzCN6UIs;u7)YSp#IZ)<;+cI!N8;(bwEo z8E4&rAeN5$!Ew4zzC_^HlPFnd)}^`qjwDJ0iYcl5wyRuV`cP^FLjYNHo)MY1l-6jq zXUW5!&}1BHJ6^Af3`=fQm&=zHd!Pn%6jeJ>hnsLEFm>_D;lQtIgI!g=eauamB$!Fp z5u-&?73D&&vhe&6M)rW6nN-EYa*HJMNvVyH-5bby=w7VFClYSPufY={o3?(z4vJc`f^%ri8AvH}&gCQ?Fv+=}H zq2CpeMO@U)+hTzy(wyo9mv=qsB+7K?eA`aVHh{Bk*sGew?BnGv*JNrPE$?zT)9;6g zA42%kGrld}gK2xZx-MmELZfKlUs^ZG#Ce?!S9cqPFbDL6E{xmlR!%C6Q_pzj+mrDm zqkAr9=Yxs#q$Q>?8;cctV;E-V1Y?&^LPq1T0ex^88Hr;=@W7)BGcr>h=RTVy9jaeW z1T(nPNb@?UF0Q)jOCsdM2x4>Vl_sNphoWTuK#ezA?D<8F_otc zBFo)RbLRmDbB|9s8kCJ%G_9C4@~y|22u=WgJC4G!-YNmXyRJbbEaMjWq*rDPf^c`= zfDombkufXnE>@6)%ZQ&i_dHS)DO7Zju$lE@;-m#@bP-?v5H{61o!|3(9+pwdnT4#o z`P4l7(AFfz0@ku4#>JajCaERz4^Vv~L};w6zhVi5RQ_9wygiSUrTx2gc6F4?7OzCM0Ot9%@U;1|n#$h9 zDQ|AE+0{#870klZ7*-8@VE?BHk+CE}4Wzq9kdwf4ZwfbK>EbE?hWH^ojqmxN|8m9- z>YheXP?l%B7!EaZIDkzj426Ca1m1(&~8z zG9SR>tr?#=rEX6y4|whRa(VLY66|(a4n;EM1m*IN23p) zZu@@sI+18#s6YI~&Vpc`!g^ma>Bblmn3y+PXIaV3`iswjy03^|TsB9}nB6isot?B5 zNSl}!VgE{~YAWKljN2=1h5JvJOV$dt=rxlT&a6zJ<|($6Zp!Z^TuZgL1PWLBSBtV+ z#m@W~N4_*Y1OaMIxs8EV4jBdRU*+p_9llh|A+{5Wq1DuAd{R(u>Z)S-Cg;+5lj)U3 z1RXAD?78wUUh~Md?Zl#uI!Q*o*uU7wagw!dwa@XDLAc74JJ*lW;~aQWU@hh5k_8{oBazbnZqAK$s?|}{e>`r|nJ%5& zNR(=>`WU|YAQ)7G#(=s*ntO-gn#9e)(o|#4^@gD4X61apCLNan51MU!){DRgj(CS2 zwC>^yo-XIo?y?J)dN#i%lSbgxyafQ^W4(!cqCWLSU)~*_m1ajjBHtxWejP?^+32aKCl)zhxbjTPdgi__>46n+hcMKrpjUE*KB&__4nYrYpJpUzErGfh z48^Q}hu2DF8P@E8&x^%e-4x%tZjTJWb;P~s%L!Xz%33qUed}3&Ol8X86vML_YDJxVBT`!Ny`mRT>_Jc zgaF}U<-{&^c$}v%GC|{cEcSk(aw7OSJl>Nnd5RHqdC_e5dw*n9LZHrRxC}PJNp`)m zPGz=tici{7Pa^5G`bu=>9bGs~YyIrAwi{c{fkfWz*staJQo%5+Z-_FdOeCbthi6M0 z7qXj3b@^cE3rDt@ug^s&fJEl-^nCKp&=#JVeHUai2jdSAbJNY5ot6bo%u!yucH|g| zL2{M~K6nYr6*+02s>xCK`1e{A%aos|-y8JbkJ`%qS@9J7i8o-;DPE4(oWJt^pT2H! zf&;lkr%>ZMvaM{rcj&BNogJ@u*qd(S_CGWy1+NpI)I~<>ny!k4zkibK=0AGudD}0wL1l;c}r#(XMLFE2Jis zzNyG^LokmSTYv5Zq=V%ND1&ZbBTqF|E@)c>edLBy{wno0js=^YrA9OsK#Z9MRS<|6 zF1M#=b(*d%>9DjPPc|)5(8)MW?cTYs2`9*&QDJr>f)}cn#M1^uAWW+21Ge&)PVYI@ z;5B7`tM39wMzP)60oQ}~9fubWiX;?U&Lg6b+0g5jLSfU8fWqkP zwgo(dCx2Wr4ud*^)i$FC!#0K+?!yDPCfzCyseI4?(|9l^1d?fFT+A*WM}mCI+60SGYgn;GZ5C_YWlSW|~fi)DWMI47`M8SvFP$%xpfFb3y$%lGj5 zSBc5d%=yG!{Y&C%dKn}bIH5H68bm6pEo7ajCr}BMReD&Xx~$X1a(Q0U z8oi1k97%}X6rJ~s0huS~K)dk{p>H$aTi^#!$c2~h5x#1MG?VRE`snOb6_>G?GqmXB z(BoO=IBLp^<-H7%UFMS z;ofN)UNPVmp6tf_S>fQJ_XqUs4)6V6qlrlRTH_$^nnM1{9e`6=r^7iX5dxMW2OgOoh!DP^73SV$?8<|^k3KUQXVXNpB7Nr0L~HPY zMVOJwlI2yR|CMbM&Pg996Ni?jACxKR^uw1^W=+ol?m!E!XVVbk0mcs%;M`U1Ulk)v&Oy%N zqKFG!@Hd)<{LZ*^V2zzgCGVbj&O!~txLg)=rNz2MYXRNWhhf3TpsxV$u9%)_0^E2~ zVqI`&DuIf7mI;t$)8b#Ch66dSD2ksK=}a!5=Bpi=XUcd9T!y_~$g{w!R=FC6p2F5A zHGN>Y8AmMiO=^O)Yh_~h7v4Omaa>u#*R{coO~~vSSwSBQay+Eg*0_B6Q4O9qH+R5b z=;44Cm%V%FhX%nf0LcJb(aUG~X^9~wJ0zov_mszzzc|Zt!~VwPS<9zgO(*AY7l05X z67O7rp?RYWwSJ)Mv7K&lnch6w%jUq~!Tc>Xj#uc+ES1<{8Vi#chF?!6H92~-jt4Eh zB(kIoOpSDS$=Y##>U)W8*l$Iyip}DOtFmxxaBQnw3P!rk`qhKemGSvSg!k?mM3@1Y zq^hadC(OWB!GdIAb7@0IilyLHW-#7`zvjw+B$0U0*1Ld&M4v%ujyY1;J48z+{e@g&!^cS2}FSg zCf2UFi;2c|+*xB!Jr9CYMsbRjm-avWdHy9W_2^|O9`IouM(){yN)mX>8RuTUuqu=2 z-^Oj!hGu;Y#aESJPwBE4OOYU*@}0ymLs_X2^LGKv$W8%dOU7AX#Ns@X7lDae56XRT z=ncO5TRHts7N4ucX7xTKYD&&y&tAO9zETSg03YDZdNV>v)#I&o+dug!q13lCvYW0^ z3x?ne$kxa=#(1Bco&k?ATzG|b5vPl3Hv_RG&s4waV}^yl@;%RFA_e+ti0pY6nd;Ge zm6^xDR#<(VFIbm5nmV&4U#_+Hu}+)Gh%ag_f_mJ~PTiK-kwaM3@8Nq|PILhQ^x(&?EFF+SkayfwNeK~SS@BCKtYM0R)<8lKZP7@M_UBe@0#(AIEfr zXIf}CnB}Vk_Gr5-V3sp0wDQxAlFjJwwxxC94h(;`aM@lQ>Yo+utZDdX%SYCvv4`>_!klja!ZHxBHXr#>ls6UoqM{!(I%bVH$vBJR#v=RO2)Esa#@!oO zk)4!(SCKB%;08X+@~#=5Q+kFk8ik-`PCj|mr@UwNY`idwh)?v%z?D7C!&fn>P{{%! z9%XS<8I*<>N&LpU4vL07XO6@M2=@lFmB2}fZJ|jZqH zgN%W@E?7<6jUI@-TYIS4*9}!k>3PiQGPAO-=P)F{uyqb}oACg@{n6R`2>j~uYUodw zmST3InLaOXs$>PFNNE^7E=0v63|TW>)Y}?knCKbd%BW;w#hBX=uNVN(>u=P?QI}26 z;6nyL#_udhEV9#&%uOV*eiPnWii2yE!lAM6>rQs5g!V$8Z+7VbppHigu_E7gc~&5D z7N#yMt$S6fOi_5&A)pO+`|Sv{`ogv9i%g2{io@hryK;o;TZ)~_ZUv4d<=KoM$ufTzV;+J)qmX+0VqbBLbSEf;GxFGo*G;$o6(KtKY ze)oUL&0ef10n4BRzV~7pvM!ENe&OJ+Bo1v|8s$Q};lj%q<;1`prfZ8qP;gc<8ct*J zM(ePvJLcqUyCqtzyL-ED=Fr=#-iNarZ+{L6y`SK(>y0%^@XcKg^Se z2BbTpJ@JKf+8p{mf!9=-{!A~9a8_fe7GpvxgGz;}$(W(1o@UiTiDP^5RcWV^)LzC2 z3QJIdBD7p}JaV#`P?UGR@@jTRbyPO5u) zTgSynPp-K21HR<`V~&N5^uu>{!Q%>vUg7jZ6oP3!+kCr)M)ce-J7j^WuOOU)Em zC^O#sKcZeaXBxj66nXCluCrDI&fmhFJvAXPS-uM-wweE9v_Se~@mn!YxN0&Gbp1zM zy>hMZ9#TuE8J|`>W)mYk3Di_{Z~btUbCp=`wxx~FnY9{-ikDo50LDF+!)Z(;mM)>&6|XB zJuJq*lOaxE1L-t0{4xUHCXRP;WM&1ewaKa+i@OGL9^-!rpGmo}#al<0`nqIhq+}x6 zMDq&Y8W?=_U=Y7qw@riG(QW_5*{Rj)2Rre}fE+xQ%E9*mQsco}G$%^=y@g$uXM_1& zub61Y=$dB2FI-0H{XPD?9EUdlPlp|fw_m79swXQF0USVwnG3nVEkaJw@yH`Xr6fdP zI->N`X{AvEg>Fg3S1ZMhCM(1J7;u=b5@DdSvU1j=N95$6PM@-aKY3kmX4-l*dCq}H z4iPL+8GbpwxzCyF`Gb%BH*ku@*^8tD<@pasG&+r~JY# zY@dvLE)<(k-an*mQh)ai&sL|K-m+-6_ES)Z?eK4iNPl5rPwVM2I+06cO>bdX570xO zk?HT7*tY&e4SWmm2$}qC|Ak(9;$#`VR8Ky1pj>Q|6R>A3-eP`A*}f>OiI7 z!3}5Ib8`BGdj>nyr~UIrJRbTDYINR-eAWcJH3XCVgCy3#B>LYI5B1 z)v=cMR6){{;pZ|`zKPa$&F{N>pK<7*s&-1H?63wqlI!A2slUml`^V{r4m?6x7CZT5 zNOF=+bkV@QFgbs3CPv1w6|3PNT4Im`09Bd7OU(=sffl*hi3wsxe{i5L@e=I^f4|8! zguuzYPOakr*X@tHG~cbh6^|M%mv0Tin^M4U{tR;&N~iM}fM2R;n{nH6)`(|E2Az_u z5(5Q;o+X~!*U&3y0q;ECk74sM6OJYT(4=%760m=e!-&Rakd1ie3{qo=qn-30| z!}(~ALl|MfEIPRlPIInXX^yp-VJGwJ@eZG43eFF~Q6&b;TwHli?63R|80wq#&OD9BCzN zq39g{{2@}WqC3iA9gQjyUr_7qekBuh;QO$xcj8YBii!3L`dpr~sG9@FPUKY$+fyPR zI~1o#U`aD6HkdHD)*yQ9R!vtxz#<>oDzoBdeRNyc=@3umS?u<)MusJj83jM_n===( z_ms0psAWS;W2g=*uEVr7v3?@r4X+E+JnGfATbQ)Ry8M-(0MA*`KwKT#2_Qlyv z^wY5ZG{Mb*H9Dqmdrf5l9j8qV5lq`}JVqpg&L6UPtLv(4xbIcPzU=mRpLlnlI8t@0 z;$aQ}iIdc|s*=0r&AGGKdmmPEW9X!n#xZ+CnXe*#WUdKKs($uubV7*@wN?dravwdI zj8vx;k363}|0Z$lI`sCDfW5k8&N8kHfF*mcVW;()i zj9HN)KmB`3x(E5+SZoZqQ9bMqvqPA1X7zU#7TBQIU(@<#92)pxOD zEA!^}O9C{r3>z#^bpB;j=TO~4q6NDTp=$_ud;Sq25uaV`=B?ET1poF8+hO{G21@Vn ze3sY4t5i0W@Ch+=j}S_#^+BnUxj4@!FmTNOQ#GxrxoHp9(y8=^FWjtwz?+*9KJ(Q< zvB~7d4K~UFc1^_sF?-NyLA5gX7^pz{B%2L2tmxAzL|LK{}d@I30qzF+|KL9sw*P~q;H1XBh zL$P~dh?`@V-;?#D9>@9jRhMBMnf{C4bLP6{rroBqNa2Pa?nkRe`S7Fl2Oc(pSn~gc zwzZ1VS*lT%@oqZkNq4JoOTRQvlv;Ga4Wvas#YU3)uK8^kwUIR1=+SOnoQ@~$oO|d?wTEZ>m`5YfOXj9Y$^gqQ)=4!A#FACQB|_wvbqA()JI%Km+JwhO zpKi;0L{j62%lhCCug%8s!$~~F_Ne3yL@t@=u>a{2(*>_B9ZXKn1slelG12beVF)!r zydjhE*J|V-?b+QQU%Wm;LRC7znt_E zkCKRp|A!N2fxY6)`BlB|{$cHGluuP^uEN>$LRC1%p)_JC6Ur&we;yu!1iT~8+@keB z9giv`bVS|-zi=sLUHQQi>y>!J8UR;(>Y|x%U~M?6@9xm|1szB0R>X@uzYkdbuyhkT zBkM5SEMVLpb93M^ zAe=vNx1I1TZ%W_)tc@N$riY&FD?LIkExb0Fxq0Bf_9VoMbTyS$WzeV_-SUd_r^w97 zaK2O*c17I6GWj?tXwk!eb?r;CSag7SGdg2gxPSEVPtR)orSC%6yvVb|09N$xZ-xxN zJTZX4z4wHS6iWd=7sj#_B*A$(+}q>thL`wdWD49V$(1AjP=svC*6mA5s*zKduy7Sc*9Jl0*q_%OaT#nuxC@AK7TTgpl?{WWXou@o_xO++31eE*OV*c zjcibwu_V7?k0{-j7Gx9Y4)20ouZJ{XyMoW^kHZZ{ z2?VZ88IZo@TlN7;J5)i~g4?U7Ol1I7p8V;6H%Y$zcsXxPoMZVgUroVq_%ILn&4^^% z?^o9zx$Wo(a96Bk;Ii8%pQ7Qz%Gib>DoxaGikY9eb7fYUgYeGJMUn&!Ldl7*2WQ)@ zjyGx%fgV5aHIs23#d6&|`qNL?Qd)Q%(jY^cO#Xr0&q_v2%*fk0k~4q$K(!vg~9E+DmTOi~G*?(-F5u6|mYMRu_O+(D`qcz|&+YWccT8LdJP;kLnop5}fo@~PqUj@xUr zjHfwo$Lozm{{=UG$O*>M17-@^9iR(b`lNu`s2)iEX#76$*dY){db@x_v|tW;=UvEd z(@06o?wpOOGn_R(tnKUUP%RnPsLR}?jK{{BCs@d7BKV{=z`3C7F%3t0*xb{_yI|MX za0C8y!`GWGiZT~H&OsfPONx%o!t}5vI;RzjPVfoWgk`@#8~9^AwSUi_!RP+i;xFer z#zlt!{@!Qyzhz*fF6tG2y7x*_k&iMkJQSDO%>UqUL}EZH{tP2>8|}^GZQs4+fMh$6a<7H~r1*!gHljAZ zUSR?r4R|Cz1mj)1Kjg~Ks3D}Pa-4V8nPU5onLST#dRW?8iuA;HoapKN=)=Ts&2Z<} zq^T`;{z+h61jo4k_!a2kQ-@H>+I}ErJ5JrPvvH%*8qkR5nYl1-M#jvF%RuUuY+InW zzDY{G&+Fn1fnHL*K%-_5R{{vg0peN6#q5v`7gB-5(GMry&eze#f1I%4A1@F_&fr+B zl0Vp}K{W;7ndpMdkxq7X86;yF4F2>$kGfq-bL3tpI6amp%FO=e&LQvc!%jY3lrk^$ zHB;3W@^`*=gP+!3RY~9WD6|XZ;#dqcq=zJ3kd`NLoxhdN5H} z)16yh+1_5O#^MA~s-y78D~(zIyjw}Z`m&D4s6%RZEwcWN&JkA*e-!)KpF7j_N%In% zjm)7Be)abDsTKuTYm2O%s>4{GEV167kR=Uro38n6NpTeImmC|(+ieFkUi+u=yU2v+<4wvSA0>0W zavKZqrXL^Kc9yx8s7gTbrzD4)w!Wn3Ei+FszCzPo$O@&42wX2rz# z#!7%}o-Mc7{xs}+!A=SKY+EoQ&_2JjmRs+Bv!haR0W@QK%X{p4ZBF**m6P;^)pFcd z;RD-*v)mVNU;vRj)4CCH9Lp`c<^dmXA@A-iy~qpXL0nS&c13ykH}`$_ndYX1H5DvV ziS4PK{M|8h)Q!(Js*2_e=pt98|0Edd1(Wd^YW~5pRVkm;I!=sgF2fswh_g=OycvQ1 ziBFc5Wa=W;;6B~`G3>bCw`P&sOpWCBc~5U95&XA9KAik@s5Y(IQ$-@YFzqNM25 zgtx}VU;h^S-*5e=6aN32GFqyz_nbNGI%ic6wE*-f`vg^Z%AdLE4|qM5ou{CaS@m#ZPNf9b}Deqt2WVw`_8jy?xks#aT?H@fBas!qOz0X%J?y1=d1Yef%jXQXv(8G@WXWH$-HxunT8}hCKTEyQ4W`g>siy2D7M!1qg(e+4X8V} z+KoK@h0TC*I?fdnuq;0*C17EbJJk9&ASE@B2-OfA*fiakf!Sa4!Yg{quB$z>buAcF z{JuZ@(EG|cshc7z{j-MNEcp+=Ym@$`%$Ng7$P!BEQz$&g)S~k9Aa93f-ZM~T@25?k z1ui;!*A#PH8S`gyV(Uz|`?Ihg$sYu;h|gn*b1)Fr)SiECC)+pP!@o4*^1iFl6Ue%R zL>IpNQpW%XHk8G>7w26bdU+L&aMqAGen2|D=}JOcSI_oO8oeO?vyq539NS4&yC8;RIlT7%?keD#i8JGKSL)e`pKcr zeNyefP0VM(BVcEH%3T9%ZYy$qL40gm28dH&q+NGQEEFcTS<%h`8v}trht1V6Gll7N zfwyGr3I6FmrKP#gX}%I$UfIMC>spkCq-jjoVWjkvB)=TLY6zEjhZ+D2`Cjl{s8BiY z8ZxYebX&L}9msVAmCSKdl-3Nd&uC|gY@!!CwN-;jR^5;0LAv{_wcQc^@H4xTyEbpC zuJ*b5nb8W5_V*`ab_gw!XYN%ZhUyNv?gwO0=F>9LVbNc@Hu{_jVGrIjok}<8@X*(W zK*2Lrw#F#wQSKAN{j~CX`EF>jV=9v~T84!mL!xlj)jB@sH@cFd+z;oby|L@%@j{1D zsE6e@>b9PjrUuZM7qlw!xZCz|R=urVA7V6^cLe` zkC@Y=VI$1jl$Xoz-@+Cc?t*OFDje*3iW_QgJHPwRpG{&%v;mIaz1ONcZTn2){(aG$ zmg=`g@RsSJjb!2|Y^t)esTuUvla$>_wTCalrJ?%{TGhyMa^ER*wa29eU*RFcN%w%n zC73Qs%7Ksb-(1EQJvZM;5C&X&j%<9^?Lg@-H6iOo^dfdg42bnNM!ao)e#xtlW#l`H z)_Ji%6X1c^8T_3Erjx}&^d6m>S7wXLs>RK*ncEw;bICHY-3LE@C#rOxlJb)q{p$PJ zJA?}eF^AbH!W)oEr#?N1DEkt~ug#FK60DMyY zvNt43ls1OgvUuCYT3g<-)z&TQsou$ql|QME%CG@y_dfaIL{ld)gw}rh7#lE)59V zhIOaFhSmGdXSsJCbt^nJJ@N^xD|EgLcbT|Yl{i}^&5L>+vUD-{{rw~pi1N1ELv|i! z#DE5aH|_2t+v#7M$%4LONsay2YrpFB;veKrvloLZ1{fCTzly|vjaQ-k5roJQMUQcV8tI??jaZwOjbu03- zG2~eGa`dgfqIFo(WA<9H?vTy`i%;;fN?Hxag4h8!NGn9ftG>}_R5+{qy7j1Pc|6HJ zU3H&~j|D6K*1+Xj{Bfqy5aOA>T(19A-~(8whdCsD*#fvhMf6_CUD1p8!5m-zRp{JI z?#o5Fz0olRw#g=}iDYH2bDVZ%x;wx0bX}S6r*_bh#iW*K_Ud0>K9MoZF*%OS{e8dT-eU>H|=kv6o)&!X7+M_uov zRyO2S=wDy+Uq=Fn$k-$_Qk;?WcBPTft0W(O-#X5%!M0yru=}z+b-MiX6%V@a;T+-* zS&h7 z!ST5XYB0%r&-6mV5(`L003EuIrN}%xKzV-&?C&QdTO~Uh-&>4Cufg%sPVlYK zasmv8(|@-ovj@C54GyqSoBu};{ZF2JSx?~m0=_nH*toU9@}6P~V`;>m|J8!}=zjO6 zefQXRjo<#>{L-lp#Uqt7y?p(^3+$W`zjF~P9aEH?NZ2b+eSdh`-XMUV>vO` z4jzN0(^VFl+rvhWj;EGP^`8+NS?kN*p80nFC2>Juoy&GOu(OdPsDIzk#J|d&MZj^! z=APIl{gV&#RL}o}9$x$~1K04%M_k-f+p^7uN!Z$Hf$^j1%f#712bfONO z3G*YZ2jT2v`(1IV)=Vo86-YSJA@sk($tht?9=hyTxVW?5{meU!Hr1uTSeVWz( z!Pr|z#nmkP-*_N61a}A_!8Ihf2Z9C(4grF@%ivCMhhRe>xI^#(g1fuByTc&A&2!H= z_mTUa^{&Mqy=I1)y{mh7SAFZ#)#z7T2;D}Lj!u2Tz+lD$N3)c?5z)#_mw=d|@uMk} z=;bx9WTNkl<~RgT3G%61wk_8?<^4P_X$CSM{OZ6~)uu*!RmHThH8J_5jEQ@vU(fFm zrNwSSbN6pT(p;9*f9|f^D^I^_$Q*Nm3BCX}dh&D%9(s@!!i4XCD#`7id-b@_n@ub% zGITcj%ot>dJS1^G$`N=)>5tV`iJKY8Y_8o~7^DTuGYR-BN4ZX}UFEBF-dHZkAjhTn ziN-yY74kcizdS4{LJ0)m4+Y0?&dqgdiE!-$Dd!GKrDC;GNQp}(rG%uET z@+&2FmEY@8c`WJ}y}Bi`3|2x?$a(170-fuk7?$TN!Lj~6dSLM5Kovp^s!e={>9Csg zOyhIqwC+)Okg3ErAJrGDF(DA;j(Kg%nAjWZs>^o#xrTXsFcq9L*=fq%r3M4b;ucx7)(}DmsV+6A{$9AMOf?y zfyny?6sUaLv-x|zowU<0@G8K&BT<(+*FH?@8{VH;zKsoQ|jA^`-h zFOgkgK-uz+JLX(DNvD2}g84e=67M>H30%ys^Ochavf^Ygl()5$%WDwdPT^4<@QKvC zAoFc6k?z%W*MZcPSbgP$POm0uF4_(ZDrdgzw=MR}h0s+sOwDE!3~_D?*;u6!9k_P7 zg<0K47z@wMd0rCtXhmwcG<~lv2WIE1S(=3VU!t+ZaU^-RFPcb4+j(glwA@f9!WIbE zRkx<+jKuB@r|_H$hII)WTF0f{E!I!Td_s2)*tqau(R{mD3!lHhYeXUUmv!Fy zk9B@n{g-ORv7a>Lb^#-ODv)H!_C(VX@;klkK#>b(3R)n|g<#waTV57!F06Ar;^A~K zjgfwJB)0Ks3Yzb#6VnAeL4?Dl?g@-B^%ObP!&Y9y%o-5QL50@H@+urZOR7l>ejoQS zdU<;}VMLQFn%h>Wr;6XpSD5S9P2ZYL`C=?>0rY?hOXzjk5J|cFNc=;ot+C6-STM*c z{V=G3ENJ0!)h>YkY7Mk~@e2W7mYDZGkOCs{oROmyb#uW-QkPIc6BMbJ#?;ylitLD? zi};PlDN7SbLf?k3SEkE{R4VTu!4^n(h3vfMwvc8&#lk+c8=$Al;u6o@@O}nFYI=XC zFI_t5KyqLKJ8S9RN@;7&Q0iuobGKZ>bhlDNREFosbQ(OVg*^%sKW!_KR;a0|a}2CO zadRfL_F@#1QCdS!(QvIH5!^pLq$S^y;iLW%bryEPx&WOmUefk-x+j;Pkv^E6b5x~9 zFuCFz%X+9lG#Ni2>>nGKGKmsjgCp)(QZ$fk*{^4r+%r8Qke^8@M%vtWkhdGc^bhfM zZenZrJ>I4TBZPa_T z)_yTO0eF#xN$qEMZ%6uk8<7kI|-!3&3vgksj) zBf`|!F`1#n?ZeaR;h{aj!csqy)s1qt2L-%3tbDq1$x6D5YI5^KqAshQv{#?+L?7#Y5O>S z@2DA;2(MuO+-mIJy@~anXEy@&YyJD-$}>zJ>#byRxCjq-z{0tS&m1I>hu?~V7MVc8 zM{Lk0J8^4Xie}daD)>whjRG5*>Y9Dvurh~jlx7bDZKK>sST&NXjFPr-p*x>CeUt=5 zZ14i~cL}@}EV1ba_IA1tT1vRY?bdUcxt38Rx*FRxA6Y8JB^iS!;b-|HDOc61eteqt z!>ILzbHHJ}`aUxyz;*JD^wdDy8^hWC1z0JjJj3A4ltlAO4wT^&fiARomqmG5;*}h$ z$e%WIwtqE*G++p!Cquw*PzF*U1>~zxWqeU!n_EWLF7J8?isq&mLTy?&AVHBhB|T&3 z<1s)r?23i440Q=63Xdc;u-qevc0Q6LkLo$xHLDIWG(#P3W}2hjLVxIxeifszVfms< zrV;M^#?QFtEnf5dkkccm`)pAVpAQT`9T@4qknTSgH_jRIX|PS-+hDo@Q$?;`Bwdj)*e zLmfV5w#Z$r45}R9z1)MPAGmcvFv*53wM4@R^%-Jqd86-bkPMvp$EJi|@O$#EAD^l` z9j+=^+pF$}r3L`#@#AOvumJ&{E;I}a49p0<1#k{kLu}1FRI`T3>fRW)q#QDd;hhbn3F-bWPgz!1m?5O{9gVH+A5?&ILweb!I+`S3X{Rcjdb2lCzr^B zca}UsrJV=~_+V_2*^fsyZ+Wm3Ocp{I)9LF{KE0}>;VLxeD%5W7v?hNm`iu&rb773N zU5Wn_TosdB0~`2A0sdj32Dg$G`P08a53 zsrCQxMTN;3?C!0^b+_}Ui${{J1vQ^qh>&Xu`$q`H;5o1;#p;#fDAA*5-h!|ca8)OD zC`=cdCWZOI_oD%7CnxaX{43;hwK{v3p4G@98_@_R&?YCy5O&}BOxB7>6vnEc=(YV}Rc#yf8IRBW9Za}5l5QmmqK9jtxx6_e1D5}q;H{Ii4OcXei?3N)5aT{zn zWOZi)(iAhh1N_SbjhV2jMMx=I%VL=L+y(P{6@JdEi_eOb@-b&VB$qU!uJw)~z<_{% z;iT$!^#DdX;o5xLt<1B#jrH$&9386H`Hj_7oL4-L)?ce)phWjzBlXY96#&4z7J7yS z7WBv~PfcADBRcP-c%vWbnS(TBT7)#hHVMQNh8IgcevssiOCc*Ye7U?%9v2M*1u+9c zp}dicF$C&iUT3Z-K-f=FaU*`yna;%XMfnoogL?+~pZ((28zh}+eU4u;^`?<#g%(Bh zP6lnAaM0r9O);M)3SSf(uwQ&yMMn{xLw-WeDIxh!)5geg_rq}1w$`dgX;F0x!+#bSN0c)I%uh3%5)r2LLm35aK6*54&zi8E=j z^x-z2Z!=7s;+ygJ^K-`yeczoAo6$!lCh65VfvEq?Ef4;E@`tX3L5%*{E5gFu^LcNK z?V-5LIz7MF@g%LC(MXDA_Ls$%D+r|FA5Q8ApbqLzXKp8fvv&EChuM#3oT$$O{o2$msG|Q){3aO1ueTAB-Gmp zb8PUtjFXdBD(l?4|GG)mC*E_-k$l~YSORl@_km#}qaDdLZDWosQ@x7zSJ z@||lXCDl9j9}g8X$(`a#bVLcJ?~#G*4}nxt_)8%GEtGDG`Mvd!OB`!mP8>T>$>DXl z@7w8hF2Rm3<*fsDGj>phaE8@6h7h6Q@0ET+kHWnCXcc#7HHg3S6wmIF!0+|k$cCnT zbr8+O1_R4kvY20EhCT&|QohEsi?Y(?swL^QAoG0564O4CL2T}Uqh-R+%~ZWVsKS3M zMv|2F*iXsDnCJr$$*lp$A6Fz4I#7(4pp$ULAKg*Ti8~k7&rsUO3O+p_ev*NbS$-X# zdI!z-hCiA`*A)=U^f~44jS(48- zM}yc$Nl5l7H$gjO3@iKKm;!iuc`q48g_|_TgM_JQ#bmDyW3{fdPQ5MFto!jW%Sh*k zf3j!XVlgZofaLEQYd)yd)rw117QSGKYs0OvnNO*v!yJ5f8FZ0uvc8F(9qQB(Q@7Ez z^&Qlj)fI@i!*y_K9DfQ}>jg^^&5ElVN&%6kP`h2+ z)lV}RCM{{!(s7R%Qsurc!5Pr4;A)*k=N=vKaM#beii{7SoY0yT9F1LTEX2a!}x$7K9W=V>igeRWs zw2$ogPInqmM{y@5EuJ&D^hy;?iac(JQNG<_y7*$faV$0fEq1dzWN+PyE4aYC*pC(6XI2deDt4Wfaw6D0%7}r;vyS>pbWxkcT0D=72aI9C4>IpeGmkx(1f}<&0bwl z6kunyf!DEEPU0Zv_+VR|9c?eeDj2e={SE+hy(Mkq3Ynk;H+dM_tuc)Xw|!yW@b?ZB znSaRn%^Cv(Ui^K zU(QzKDFa!396S4qHJxFa`7A?V#KgR|=U$IkQ)(TUj%mLw(all?}lWB=f8R zs?{@tX|tI$T0YdlFyRhViY>SdH8`4jSeq1Xppd&JJ7-DcSTU60+^N^EDFmn0whSMA zSiO>WbD$FjvW*=fy<^e}1C->4d+>X+p(2~%bgAmoKP^r9U2<*?xW(%ZF4nbty6_l* zL8$Agwi)=or9yJ!#h%`ElBMUEyauU^M$GwC2`(@Np3EDRZ<h&Zu^&wyty~6_MW%~-S(CB!VkNKcW1zJ#Y=raERqK_?tOyD znTy0U3_ds1je(LbnBR7)Xw^ewi$iG?d88Pf@^Xi4z88Y|Hdanq=`+TcqiG-S2Jzp@ z*O0SA5nWZ$Zap_oIRe)0Pkm*5Rk;( zn=t|lj-DI2y^I)L)LrIlVNwjNg47RG2wmVgD%0&m|8&kfz+S#;CH&xTzbOcq^(V?|h17lpQY zwR9ui=AA9UN2VzZ+0*(?TMx^S>f_)5<03ZDGAARdbNaFJoqQS=g2}XaF9|e0Wp~^4 z&WGTxFQeqtvx~!i&M>#Tc(-{4c_;&xg*gh{>>H+}fs^}(N=9rY_b|cv2De~tywQ$} zeQt*)O3w;QEV7JURgU(C>7pPkv>{b{vhsN=2UeZlN*$~GK8#6&WpT6?6X)MtE9mo> zdM^F5IuTe=&9{b?^I(^iwgs->ccqJ3s#sH_T%7cj{=q0adZm#nXc9LO7v!N_^7iw` zE}}$Cg@;luH@{nQ-KV}{YF1iO=avZJ$aZ6LI%P`ph#XA^ve#JLlh>V|)V(1_+-zE$ z-NRmX8mS&TPC1&-iJSLyHGGrVsz1H)Y>xW!7C<{a$B549gJBK`@R3)!-DDjsv^cXp zKcv^nV|n)YFSf8xixvQ)Z9~KVaE{xiXpSVi?~=&Q=8NRpU-0VYlWOPJ zSlUV;CnS#u*O0Dve&#pP-`-oheb3xqt#e+1H23;{kVggS&RsC{hP%qM2KnsStVyGa ztn#KfV)={&Te`vNdCgO7(RU&FA0ewIJ}E}72E^<4FXqZ0Y&dEoKY7p+{lsr#9?#tkHNbENmjjTd%Kk}ouXb&vz(H^C- zw4Pjf_ibHJD#NYJIBv^+N?acO9?k|HlNbQTC-((lV0{^PDD1`ZI%`S#rJL=qQdyq&TRk_La26FWfU&4EY+lD}QUOZ*Lc>W-;J6 z4+|UV1Gx}HIgzp*wY^W3WCP5nLCaJ((D+(>NZj5oq0;ivOG-T>Rr zjko1-5Vc4;{&a)Oa^bH`Kht$N9;dNSZp<#r5l#FVc2B!W9d$QVGFLG6Y(z%JXBk7lJ6RL7e<^ZQ(dTb&Y=4g{(jxEuR%eHb z#At*0JD9pxGYPz0-aD$_9{QxFtsm!A(4 zYq`~?p+{yF}}cw>KUT&Q20p0GE4HKul=%O(IrK zR$3C9YkHgtFUaE{$K!M+tXYYyar~oi<;y5jWXgp7gTxH#nTj-UiA+A*jxont8UfAh0ImR9kJXW|mklK4cny5U$;v43V) z|Iu!L>M5D&THHUmSO54>l#m%PLUJX7_x{`)|4CE-r=d>`7~_@2e8^u+^q;r?)u7}8 zdQpj{{o+6O{eL#t0ArBhzC9HCua=D>1}vM8z3TSgjgbTxBLaoQnfjlG`qL|t;echw zk!?Nt5$ra4sAT6B9}+JFYGnuqo3|PqSc_^z~`_=kZ+Z!Ly|gMm5NqdQ@p=e zE^l@4;Q8GUbdXm3)3)&Wn^8f#Yr(qwv)VF!n{@a08+Ep6O8Y^GO3ga-*3H+IM?B2| z@)7mQ^q-l2s50GJ`th+Y+cyu?GLj+l-Q5N#R#%h6#sXrWFHlq+G(G<)TcbJJq|-rJAkW_l1LG#fUb|@rcj2V)S&ic4|K256!*4 z(tb>Sy2YW$BkG^Mc*BKnOXhwCST`TkG9I8bUO2M!qzLA^ztfKhqqsDmHBLgb&zk_p z@g3XIEpa^BWUoF*Y;L9NTqLrzzsA>b*vKC}xP8^68R6=h<9<2Fx8!)(Y5{m1#=R?l3z-*^QeYo^AK9_Mrc{i~ehvi~G%*zIPTW6#oea`_zNC&g2N(1{jxdaZS zbU*tD&=`fXP(e_+iH+rlHujA|+6u?9^eBfLn)|0`S99_>&SS4I-Ip98&(BCkgUUR? zG8V`1R2uTia6O;*Rj+QLbM}F7w&?DTidTmleV+a9TV~t}P=?O{?N-kWEfBIGn2oc% z$^BLETJz!ILlblzbHRi##s>fK_bq=Y0Zh8U--jv!Wt1t98X{#moDizl0e!!#G;coV z2gNnqCf%fcf*X{gOUvWGg`tjtIe50axHS}8pBsBi`nX!s?R#jbZK$2ScTVXHCw%2A0DK0*8B08qE(rdwIO{4?@EL78(khG zlDX}*)#Ud$n2X*R(!Ur7&XiQrT22c)r)#Wfky2mJ8fgwdkNi}tMs5nS;>ve5d()$P z{B@?>veZJWMk&YhmvREjVk$MD=(`~gcV~s_o7Wf5-9)SRXxceDx{7lEG+Zwu+ z4s|{**>ka#-3UHTAMc* zRJch|l%7%Xwa0UFPPm4-8s=OcikBj`y9>N+pB8vjdee3(ks9D zag=yr?zC-=Q_?uowYb_(?+a>h2!N}fFV?6~$yj5?`yfah`q^6|G8!YzEL+mG5 z)w>A_?c0YL+bp-}%`~}2mV_S9i(5aNl7W2L9oxP5SfC@W@-x+qnMt!&>TcIptTC~+ z>-W;%7dsn9>~1@Ns|hq-s?*Z-D=7}@lRna=5+CoXwdAciice_>OY~B?Gnr!En^WjW zw_@C#;|s7{IxXe%m=aSj5MZ|iU94HXIW3!-I|B?KQabz%(-5s>gYHoOamlDC9(WFW z<>+G?K9^>|-2O=avKNDZ5q?v!T_o2d$E6OhL;)@{GqA2(?!k^ z`lE_~i+RM=T>qD{nrFHPFT0n9Fz82?_b~B$=RSUw^rz}%)F05N>;aYBD<{$+BUj7b zx|cUzCVBO%A@gz1&kf=-9^Ciev2v*`*L-xSK@Z1>Y_yHW|Fyqi)EKY4`pwtM*m(Mh+b8dkc<`t}{xOO>Bc1&7 zwBwc3!PPxW8Vgp+k8%Oy@KJc2**OuL#{2S!7!Fk@P!YGknH zvr2%VyD;PA8H_Qyqicz`#Y>hfF&yzV#UV?LS4)2EkBN@6(CXk*dW-QNzW8O!b@wga zL!y_JUfDq~=%w|%@ir!CGX0ePBhQED;t6bix7KkP^oQbL{6KDiBDjJE8BA9#EA zJJJw~V+1Bj8wE4o91mBEgRu63$G|^5@+uM={0WJYQCO(;OXBeti6V=!cebiakskbG zN1m6Y2cLr0ypgMH29a)5Q6i2LEWmsRlnPLkV63a~?k06tgi^)y_%BN3W}oEOJ1EVO zxt70Yz*r8#&$Tif;cna<5w|xJEFBdLq5N2Co!N{3un$VqNi zp3T>ow}eEWdP;%ZMA#aiY(bsf^;3!KR8&uVZP?xhFg^T)Nzv5tS90zL7=`Yb!Kf#;jYTlCQ^LT+aTO zE2I0tBdAflmSRaUlZx_t8)Z=&$6eg6IR6Tn;qw*$`9;ENm~b8hIHE(maf3}l)}`VB zU<JTs~*|l87TbG%*ltYZL;HX?2 ztZ{eo3cj1`Pm;5k z5H}wTB^ySd2Fr~;xO+k# zcAX!Ru#R*cA}KDkDVUn-w`TG+`B@s(T0KY<^n6dcm_BaW6XhSm7HH>O zZ#-$|JgBpzGs$4+UGlgWyn3fSy{5dg*c`Ih_}Fn2sKvq?uD0bjsS7L|nfQAOp0~QE zR+5Bq=0_Gx$1y<{`>fP2Q-z~fUDqe%V|t;v2AjRSr7xGx@>F$h^9nEDNo;3P!7F_W zy1Wr*5SoL2S=7q1xr&28uz~t2;c(8EH`AzfcK6F~M-Ll!-OhZpmr#kq*n#pSE|*QN zRfFz(GZcaZIAIxy}2{^zvY z_cSu^N4l53&XZJ%lwdXzpHKv1kyS_CZ6Ajsw36vhiOk!g>x9$Bxd2BVHte17=6U-u z_jy=bVoyS+kR!W7VbDK4zQTJzD37xQffRL_)auiB0_ptU1<#j=<47%7X5CvNm;~d> zx6OIX7DQ=>19byC?iUGwqrt=bOsED~ECR4!Yw6+JhL<)sgrDZ{Qfq7eJhu>^ejbN7 zjrYxuL~t4({OK@AzE%-5+p0vk8rHx+>Z5v;XALs=9E2;ZhCN4J?jg#>N4a@+mBExS zMUi24l(W^AmP>TZo|?<<&w(sdE#!x=l7_NEak*Wb=^L$+_dprQpl^{IfQScv#y|3@ z3oWQ-ZJ;-Fii`6tctr0sQQAT683@88BxrwCLuK1wX}j-9Yw^ftodq$UKil*?GY6kZ z&$}eoPod7Wj(N>jnLE%Ri+v65=?rrrENNW2Q+Q@-E3r|g_fm!@DJK^OayrChx1~Z6 z9Ohv*QUeKC}*)WF5Qc0&RnSh`DcEC64fJ=+Um|j(20BgSYFlT?1v;4 z1E9ji`G4u~gRT7FD0mi+VHI7Dt2G=rN`IkgsP$k%q{KZwwZa}={vDgIXcZg=UoB-P znD^)xy;Zh(R|?F*^ZreD3ecH8zd{N_6$#t)0khR*=*yVzmcDYb=_~c)BtufcJCH$A zq8L6g#o(VDuZp8GuiObLFa%psDqjuREGA)TnvFA2HK@FP){KOu>0Odj?S~xE8BfAO zK`<#jdD(u^ph{iNMV@IbaF%t{;N5FOEFomLk)A4on{+2)a+#M${cEzcbWj*!r{)U1N5 zT7sBgQ!6XKgPkoc2|w4-ry$w-yOy=AMk@q6TgM(Pz)VHjl&3G00=u;g3mq!)sPMeN zNPal5)6E=^5-59Cby6>Z*4q$goMx{6#9yULNTSdozdgAX?37otZ&b2`>;@cty(3^uu zKCuPa9#QTiH5QEZ`aU1tILM(EB==+P~M}4!Jt!hqQzX#8Yp$37wR1u4UP@PlFW(Yzz(=}(hJd?x5Ana3qWgG z1?^7@USz&0BVF9u()~0=!iUxuMiqFA`v{c?6*N-+k<%3ela^UZw!AKo4?~`)U6d5l-fDg|5XtIfI?YaM{ zd}iF4@ZEX!hoSM6u=;#k@_j5K$uWGt5x)-dJ=i@Z(1+lcLIz%fm1o&72Oom_{-%Yp z^FA31Pv&54)FNH8BZ#lqQ9R#SgD79IvNldRT~=b+{+T2P^b0XyGGK}36NuLNOaPWu zb+2J~Ki$&*MRCMoLVlL!qWL7)KqAV%VKqg|;3AF_8k9l|d)tO>4}|(1*}|1}JP2LC z2*RSZc`t7cjan)F4G5$VIMWwB;hBCsgB`>Tr)CZsC#H7C95<%Y|HWfu^e*w$Jy_;zt}$Sq2k zbs`V1ASi(}`%{GXmLaatcnbd_32x|=;2u>sN2-ve(>oo0u)Mj-Csr^?f4FO?4H~!L zv@kcCKkg^=49cp9bnT}GeWRHOsy%nTgc6hTJve=#8qfVZH>%0A=zMslB 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 z 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 Date: Tue, 30 Jun 2020 06:14:15 +0300 Subject: [PATCH 158/190] docs: refactor the bookstore tutorial --- docs/en/Tutorials/Part-1.md | 231 +++---- docs/en/Tutorials/Part-2.md | 576 ++++++------------ .../images/bookstore-actions-buttons.png | Bin 29435 -> 25169 bytes .../images/bookstore-angular-file-tree.png | Bin 58541 -> 50047 bytes .../Tutorials/images/bookstore-book-list.png | Bin 49861 -> 56461 bytes .../images/bookstore-confirmation-popup.png | Bin 13523 -> 23065 bytes .../images/bookstore-empty-new-book-modal.png | Bin 104068 -> 56983 bytes 7 files changed, 256 insertions(+), 551 deletions(-) diff --git a/docs/en/Tutorials/Part-1.md b/docs/en/Tutorials/Part-1.md index 835c74385f..a0f970c75f 100644 --- a/docs/en/Tutorials/Part-1.md +++ b/docs/en/Tutorials/Part-1.md @@ -754,8 +754,8 @@ It's end of this part. The final UI of this work is shown as below: It's time to create something visible and usable! There are some tools that we will use when developing ABP Angular frontend application: - [Angular CLI](https://angular.io/cli) will be used to create modules, components and services. -- [NGXS](https://ngxs.gitbook.io/ngxs/) will be used as the state management library. - [Ng Bootstrap](https://ng-bootstrap.github.io/#/home) will be used as the UI component library. +- [ngx-datatable](https://swimlane.gitbook.io/ngx-datatable/) will be used as the datatable library. - [Visual Studio Code](https://code.visualstudio.com/) will be used as the code editor (you can use your favorite editor). #### Install NPM packages @@ -778,26 +778,62 @@ yarn ng generate module book --routing true #### Routing -Open the `app-routing.module.ts` file in `src\app` folder. Add the new `import` and add a route as shown below +Open the `app-routing.module.ts` file in `src\app` folder and add a route as shown below: ```js -import { ApplicationLayoutComponent } from '@abp/ng.theme.basic'; //==> added this line to imports <== - -//...added books path with the below to the routes array +const routes: Routes = [ +// ... +// added a new route to the routes array { path: 'books', - component: ApplicationLayoutComponent, - loadChildren: () => import('./book/book.module').then(m => m.BookModule), - data: { - routes: { - name: '::Menu:Books', - iconClass: 'fas fa-book' - } as ABP.Route - }, + loadChildren: () => import('./book/book.module').then(m => m.BookModule) +}] +``` + +* We added a lazy-loaded route. See the [Lazy-Loading Feature Modules](https://angular.io/guide/lazy-loading-ngmodules#lazy-loading-feature-modules). + +Open the `route.provider.ts` file in `src\app` folder and replace the content as below: + +```js +import { RoutesService, eLayoutType } from '@abp/ng.core'; +import { APP_INITIALIZER } from '@angular/core'; + +export const APP_ROUTE_PROVIDER = [ + { provide: APP_INITIALIZER, useFactory: configureRoutes, deps: [RoutesService], multi: true }, +]; + +function configureRoutes(routes: RoutesService) { + return () => { + routes.add([ + { + path: '/', + name: '::Menu:Home', + iconClass: 'fas fa-home', + order: 1, + layout: eLayoutType.application, + }, + // added below element + { + path: '/books', + name: '::Menu:Books', + iconClass: 'fas fa-book', + order: 101, + layout: eLayoutType.application, + }, + ]); + }; } + ``` -* The `ApplicationLayoutComponent` configuration sets the application layout to the new page. We added the `data` object. The `name` is the menu item name and the `iconClass` is the icon of the menu item. +* We added a new route element to show a navigation element labeled "Books" on the menu. + * `path` is the URL of the route. + * `name` is the menu item name. A Localization key can be passed. + * `iconClass` is the icon of the menu item. + * `order` is the order of the menu item. We define 101 to show the route after the "Administration" item. + * `layout` is the layout of the BooksModule's routes. `eLayoutType.application`, `eLayoutType.account` or `eLayoutType.empty` can be defined. + + #### Book list component @@ -865,35 +901,6 @@ Open the browser and navigate to http://localhost:4200/books. We'll see **book-l ![Initial book list page](./images/bookstore-initial-book-list-page.png) -#### Create BookState - -Run the following command in the terminal to create a new state, named `BooksState`: - -```bash -npx @ngxs/cli --name book --directory src/app/book -``` - -* This command creates `book.state.ts` and `book.actions.ts` files in the `src/app/book/state` folder. See the [NGXS CLI documentation](https://www.ngxs.io/plugins/cli). - -Import the `BookState` to the `app.module.ts` in the `src/app` folder and then add the `BookState` to `forRoot` static method of `NgxsModule` as an array element of the first parameter of the method. - -```js -// ... -import { BookState } from './books/state/book.state'; //<== imported BookState ==> - -@NgModule({ - imports: [ - // other imports - - NgxsModule.forRoot([BookState]), //<== added BookState ==> - - //other imports - ], - // ... -}) -export class AppModule {} -``` - #### Generate proxies ABP CLI provides `generate-proxy` command that generates client proxies for your HTTP APIs to make easy to consume your services from the client side. Before running generate-proxy command, your host must be up and running. See the [CLI documentation](../CLI.md) @@ -910,109 +917,40 @@ The generated files looks like below: ![Generated files](./images/generated-proxies.png) -#### GetBooks Action - -Actions can either be thought of as a command which should trigger something to happen, or as the resulting event of something that has already happened. [See NGXS Actions documentation](https://www.ngxs.io/concepts/actions). - -Open the `book.actions.ts` file in `app/book/state` folder and replace the content below: - -```js -export class GetBooks { - static readonly type = '[Book] Get'; -} -``` - -#### Implement BookState - -Open the `book.state.ts` file in `app/book/state` folder and replace the content below: - -```js -import { PagedResultDto } from '@abp/ng.core'; -import { State, Action, StateContext, Selector } from '@ngxs/store'; -import { GetBooks } from './book.actions'; -import { BookService } from '../services'; -import { tap } from 'rxjs/operators'; -import { Injectable } from '@angular/core'; -import { BookDto } from '../models'; - -export class BookStateModel { - public book: PagedResultDto; -} - -@State({ - name: 'BookState', - defaults: { book: {} } as BookStateModel, -}) -@Injectable() -export class BookState { - @Selector() - static getBooks(state: BookStateModel) { - return state.book.items || []; - } - - constructor(private bookService: BookService) {} - - @Action(GetBooks) - get(ctx: StateContext) { - return this.bookService.getListByInput().pipe( - tap((booksResponse) => { - ctx.patchState({ - book: booksResponse, - }); - }) - ); - } -} -``` - -* We added the book property to BookStateModel model. -* We added the `GetBooks` action that retrieves the book data via `BookService` that generated via ABP CLI and patches the state. -* `NGXS` requires to return the observable without subscribing it in the get function. - #### BookListComponent Open the `book-list.component.ts` file in `app\book\book-list` folder and replace the content as below: ```js +import { ListService, PagedResultDto } from '@abp/ng.core'; import { Component, OnInit } from '@angular/core'; -import { Select, Store } from '@ngxs/store'; -import { Observable } from 'rxjs'; -import { finalize } from 'rxjs/operators'; import { BookDto, BookType } from '../models'; -import { GetBooks } from '../state/book.actions'; -import { BookState } from '../state/book.state'; +import { BookService } from '../services'; @Component({ selector: 'app-book-list', templateUrl: './book-list.component.html', styleUrls: ['./book-list.component.scss'], + providers: [ListService], }) export class BookListComponent implements OnInit { - @Select(BookState.getBooks) - books$: Observable; + book = { items: [], totalCount: 0 } as PagedResultDto; booksType = BookType; - loading = false; - - constructor(private store: Store) {} + constructor(public readonly list: ListService, private bookService: BookService) {} ngOnInit() { - this.get(); - } + const bookStreamCreator = (query) => this.bookService.getListByInput(query); - get() { - this.loading = true; - this.store - .dispatch(new GetBooks()) - .pipe(finalize(() => (this.loading = false))) - .subscribe(() => {}); + this.list.hookToQuery(bookStreamCreator).subscribe((response) => { + this.book = response; + }); } } ``` - -* We added the `get` function that updates store to get the books. -* See the [Dispatching actions](https://ngxs.gitbook.io/ngxs/concepts/store#dispatching-actions) and [Select](https://ngxs.gitbook.io/ngxs/concepts/select) on the `NGXS` documentation for more information on these `NGXS` features. +* We imported and injected the generated `BookService`. +* We implemented the [ListService](https://docs.abp.io/en/abp/latest/UI/Angular/List-Service)` that is a utility service to provide easy pagination, sorting, and search implementation. Open the `book-list.component.html` file in `app\book\book-list` folder and replace the content as below: @@ -1022,38 +960,31 @@ Open the `book-list.component.html` file in `app\book\book-list` folder and repl
- {%{{{ "::Menu:Books" | abpLocalization }}}%} + {%{{{ '::Menu:Books' | abpLocalization }}}%}
- - - - - {%{{{ "::Name" | abpLocalization }}}%} - {%{{{ "::Type" | abpLocalization }}}%} - {%{{{ "::PublishDate" | abpLocalization }}}%} - {%{{{ "::Price" | abpLocalization }}}%} - - - - - {%{{{ data.name }}}%} - {%{{{ booksType[data.type] }}}%} - {%{{{ data.publishDate | date }}}%} - {%{{{ data.price }}}%} - - + + + + + {%{{{ booksType[row.type] }}}%} + + + + + {%{{{ row.publishDate | date }}}%} + + + + + {%{{{ row.price | currency }}}%} + + +
``` @@ -1074,4 +1005,4 @@ In this tutorial we have applied the rules of official [Angular Style Guide](htt ### Next Part -See the [part 2](part-2.md) for creating, updating and deleting books. +See the [part 2](./Part-2.md) for creating, updating and deleting books. diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index 8ac9e19615..d296335cfa 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -454,78 +454,50 @@ Run the application and try to delete a book. In this section, you will learn how to create a new modal dialog form to create a new book. -#### State definitions - -Open `book.action.ts` in `app\book\state` folder and replace the content as below: +#### Add a modal to BookListComponent -```js -import { CreateUpdateBookDto } from '../models'; //<== added this line ==> -export class GetBooks { - static readonly type = '[Book] Get'; -} +Open `book-list.component.ts` file in `app\book\book-list` folder and replace the content as below: -// added CreateUpdateBook class -export class CreateUpdateBook { - static readonly type = '[Book] Create Update Book'; - constructor(public payload: CreateUpdateBookDto) { } -} -``` +```js +import { ListService, PagedResultDto } from '@abp/ng.core'; +import { Component, OnInit } from '@angular/core'; +import { BookDto, BookType } from '../models'; +import { BookService } from '../services'; -* We imported the `CreateUpdateBookDto` model and created the `CreateUpdateBook` action. +@Component({ + selector: 'app-book-list', + templateUrl: './book-list.component.html', + styleUrls: ['./book-list.component.scss'], + providers: [ListService], +}) +export class BookListComponent implements OnInit { + book = { items: [], totalCount: 0 } as PagedResultDto; -Open `book.state.ts` file in `app\book\state` folder and replace the content as below: + booksType = BookType; -```js -import { PagedResultDto } from '@abp/ng.core'; -import { State, Action, StateContext, Selector } from '@ngxs/store'; -import { GetBooks, CreateUpdateBook } from './book.actions'; // <== added CreateUpdateBook==> -import { BookService } from '../services'; -import { tap } from 'rxjs/operators'; -import { Injectable } from '@angular/core'; -import { BookDto } from '../models'; + isModalOpen = false; // <== added this line ==> -export class BookStateModel { - public book: PagedResultDto; -} + constructor(public readonly list: ListService, private bookService: BookService) {} -@State({ - name: 'BookState', - defaults: { book: {} } as BookStateModel, -}) -@Injectable() -export class BookState { - @Selector() - static getBooks(state: BookStateModel) { - return state.book.items || []; - } + ngOnInit() { + const bookStreamCreator = (query) => this.bookService.getListByInput(query); - constructor(private bookService: BookService) {} - - @Action(GetBooks) - get(ctx: StateContext) { - return this.bookService.getListByInput().pipe( - tap((bookResponse) => { - ctx.patchState({ - book: bookResponse, - }); - }) - ); + this.list.hookToQuery(bookStreamCreator).subscribe((response) => { + this.book = response; + }); } - // added CreateUpdateBook action listener - @Action(CreateUpdateBook) - save(ctx: StateContext, action: CreateUpdateBook) { - return this.bookService.createByInput(action.payload); + // added createBook method + createBook() { + this.isModalOpen = true; } } ``` -* We imported `CreateUpdateBook` action and defined the `save` method that will listen to a `CreateUpdateBook` action to create a book. - -When the `SaveBook` action dispatched, the save method is being executed. It calls `createByInput` method of the `BookService`. +* We defined a variable called `isModalOpen` and `createBook` method. +* We added the `createBook` method. -#### Add a modal to BookListComponent Open `book-list.component.html` file in `books\book-list` folder and replace the content as below: @@ -534,19 +506,12 @@ Open `book-list.component.html` file in `books\book-list` folder and replace the
-
- {%{{{ '::Menu:Books' | abpLocalization }}}%} -
+
{%{{{ '::Menu:Books' | abpLocalization }}}%}
- +
- @@ -555,47 +520,40 @@ Open `book-list.component.html` file in `books\book-list` folder and replace the
- - - - - {%{{{ "::Name" | abpLocalization }}}%} - {%{{{ "::Type" | abpLocalization }}}%} - {%{{{ "::PublishDate" | abpLocalization }}}%} - {%{{{ "::Price" | abpLocalization }}}%} - - - - - {%{{{ data.name }}}%} - {%{{{ booksType[data.type] }}}%} - {%{{{ data.publishDate | date }}}%} - {%{{{ data.price }}}%} - - + + + + + {%{{{ booksType[row.type] }}}%} + + + + + {%{{{ row.publishDate | date }}}%} + + + + + {%{{{ row.price | currency }}}%} + + +
- -

{%{{{ '::NewBook' | abpLocalization }}}%}

-
+ +

{%{{{ '::NewBook' | abpLocalization }}}%}

+
- + - - - + + +
``` @@ -603,55 +561,6 @@ Open `book-list.component.html` file in `books\book-list` folder and replace the * `abp-modal` is a pre-built component to show modals. While you could use another approach to show a modal, `abp-modal` provides additional benefits. * We added `New book` button to the `AbpContentToolbar`. -Open `book-list.component.ts` file in `app\book\book-list` folder and replace the content as below: - -```js -import { Component, OnInit } from '@angular/core'; -import { Select, Store } from '@ngxs/store'; -import { Observable } from 'rxjs'; -import { finalize } from 'rxjs/operators'; -import { BookDto, BookType } from '../models'; -import { GetBooks } from '../state/book.actions'; -import { BookState } from '../state/book.state'; - -@Component({ - selector: 'app-book-list', - templateUrl: './book-list.component.html', - styleUrls: ['./book-list.component.scss'], -}) -export class BookListComponent implements OnInit { - @Select(BookState.getBooks) - books$: Observable; - - booksType = BookType; - - loading = false; - - isModalOpen = false; // <== added this line ==> - - constructor(private store: Store) {} - - ngOnInit() { - this.get(); - } - - get() { - this.loading = true; - this.store - .dispatch(new GetBooks()) - .pipe(finalize(() => (this.loading = false))) - .subscribe(() => {}); - } - - // added createBook method - createBook() { - this.isModalOpen = true; - } -} -``` - -* We added `isModalOpen = false` and `createBook` method. - You can open your browser and click **New book** button to see the new modal. ![Empty modal for new book](./images/bookstore-empty-new-book-modal.png) @@ -663,48 +572,43 @@ You can open your browser and click **New book** button to see the new modal. Open `book-list.component.ts` file in `app\book\book-list` folder and replace the content as below: ```js +import { ListService, PagedResultDto } from '@abp/ng.core'; import { Component, OnInit } from '@angular/core'; -import { Select, Store } from '@ngxs/store'; -import { Observable } from 'rxjs'; -import { finalize } from 'rxjs/operators'; import { BookDto, BookType } from '../models'; -import { GetBooks } from '../state/book.actions'; -import { BookState } from '../state/book.state'; +import { BookService } from '../services'; import { FormGroup, FormBuilder, Validators } from '@angular/forms'; // <== added this line ==> @Component({ selector: 'app-book-list', templateUrl: './book-list.component.html', styleUrls: ['./book-list.component.scss'], + providers: [ListService], }) export class BookListComponent implements OnInit { - @Select(BookState.getBooks) - books$: Observable; + book = { items: [], totalCount: 0 } as PagedResultDto; booksType = BookType; - loading = false; - isModalOpen = false; form: FormGroup; // <== added this line ==> - constructor(private store: Store, private fb: FormBuilder) {} // <== added FormBuilder ==> + constructor( + public readonly list: ListService, + private bookService: BookService, + private fb: FormBuilder // <== injected FormBuilder ==> + ) {} ngOnInit() { - this.get(); - } + const bookStreamCreator = (query) => this.bookService.getListByInput(query); - get() { - this.loading = true; - this.store - .dispatch(new GetBooks()) - .pipe(finalize(() => (this.loading = false))) - .subscribe(() => {}); + this.list.hookToQuery(bookStreamCreator).subscribe((response) => { + this.book = response; + }); } createBook() { - this.buildForm(); //<== added this line ==> + this.buildForm(); // <== added this line ==> this.isModalOpen = true; } @@ -799,13 +703,10 @@ export class BookModule {} Open `book-list.component.ts` file in `app\book\book-list` folder and replace the content as below: ```js +import { ListService, PagedResultDto } from '@abp/ng.core'; import { Component, OnInit } from '@angular/core'; -import { Select, Store } from '@ngxs/store'; -import { Observable } from 'rxjs'; -import { finalize } from 'rxjs/operators'; import { BookDto, BookType } from '../models'; -import { GetBooks } from '../state/book.actions'; -import { BookState } from '../state/book.state'; +import { BookService } from '../services'; import { FormGroup, FormBuilder, Validators } from '@angular/forms'; import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap'; // <== added this line ==> @@ -813,37 +714,34 @@ import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap selector: 'app-book-list', templateUrl: './book-list.component.html', styleUrls: ['./book-list.component.scss'], - providers: [{ provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], // <== added this line ==> + providers: [ListService, { provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], // <== added a provide ==> }) export class BookListComponent implements OnInit { - @Select(BookState.getBooks) - books$: Observable; + book = { items: [], totalCount: 0 } as PagedResultDto; booksType = BookType; - //added bookTypeArr array + // <== added bookTypeArr array ==> bookTypeArr = Object.keys(BookType).filter( (bookType) => typeof this.booksType[bookType] === 'number' ); - loading = false; - isModalOpen = false; form: FormGroup; - constructor(private store: Store, private fb: FormBuilder) {} + constructor( + public readonly list: ListService, + private bookService: BookService, + private fb: FormBuilder + ) {} ngOnInit() { - this.get(); - } + const bookStreamCreator = (query) => this.bookService.getListByInput(query); - get() { - this.loading = true; - this.store - .dispatch(new GetBooks()) - .pipe(finalize(() => (this.loading = false))) - .subscribe(() => {}); + this.list.hookToQuery(bookStreamCreator).subscribe((response) => { + this.book = response; + }); } createBook() { @@ -884,13 +782,10 @@ Now, you can open your browser to see the changes: Open `book-list.component.ts` file in `app\book\book-list` folder and replace the content as below: ```js +import { ListService, PagedResultDto } from '@abp/ng.core'; import { Component, OnInit } from '@angular/core'; -import { Select, Store } from '@ngxs/store'; -import { Observable } from 'rxjs'; -import { finalize } from 'rxjs/operators'; import { BookDto, BookType } from '../models'; -import { GetBooks, CreateUpdateBook } from '../state/book.actions'; // <== added CreateUpdateBook ==> -import { BookState } from '../state/book.state'; +import { BookService } from '../services'; import { FormGroup, FormBuilder, Validators } from '@angular/forms'; import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap'; @@ -898,11 +793,10 @@ import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap selector: 'app-book-list', templateUrl: './book-list.component.html', styleUrls: ['./book-list.component.scss'], - providers: [{ provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], + providers: [ListService, { provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], }) export class BookListComponent implements OnInit { - @Select(BookState.getBooks) - books$: Observable; + book = { items: [], totalCount: 0 } as PagedResultDto; booksType = BookType; @@ -910,24 +804,22 @@ export class BookListComponent implements OnInit { (bookType) => typeof this.booksType[bookType] === 'number' ); - loading = false; - isModalOpen = false; form: FormGroup; - constructor(private store: Store, private fb: FormBuilder) {} + constructor( + public readonly list: ListService, + private bookService: BookService, + private fb: FormBuilder + ) {} ngOnInit() { - this.get(); - } + const bookStreamCreator = (query) => this.bookService.getListByInput(query); - get() { - this.loading = true; - this.store - .dispatch(new GetBooks()) - .pipe(finalize(() => (this.loading = false))) - .subscribe(() => {}); + this.list.hookToQuery(bookStreamCreator).subscribe((response) => { + this.book = response; + }); } createBook() { @@ -950,19 +842,18 @@ export class BookListComponent implements OnInit { return; } - this.store.dispatch(new CreateUpdateBook(this.form.value)).subscribe(() => { + this.bookService.createByInput(this.form.value).subscribe(() => { this.isModalOpen = false; this.form.reset(); - this.get(); + this.list.get(); }); } } ``` -* We imported `CreateUpdateBook`. * We added `save` method -Open `book-list.component.html` in `app\book\book-list` folder and add the following `abp-button` to save the new book. +Open `book-list.component.html` in `app\book\book-list` folder, find the `` element and replace this element with the following to create a new book. ```html @@ -994,63 +885,24 @@ The final modal UI looks like below: ### Updating a book -#### CreateUpdateBook action - -Open the `book.actions.ts` in `app\book\state` folder and replace the content as below: - -```js -import { CreateUpdateBookDto } from '../models'; - -export class GetBooks { - static readonly type = '[Book] Get'; -} - -export class CreateUpdateBook { - static readonly type = '[Book] Create Update Book'; - constructor(public payload: CreateUpdateBookDto, public id?: string) {} // <== added id parameter ==> -} -``` - -* We added `id` parameter to the `CreateUpdateBook` action's constructor. - -Open the `book.state.ts` in `app\book\state` folder and replace the `save` method as below: - -```js -@Action(CreateUpdateBook) -save(ctx: StateContext, action: CreateUpdateBook) { - if (action.id) { - return this.bookService.updateByIdAndInput(action.payload, action.id); - } else { - return this.bookService.createByInput(action.payload); - } -} -``` - -#### BookListComponent - -Open `book-list.component.ts` in `app\book\book-list` folder and inject `BookService` dependency by adding it to the constructor and add a variable named `selectedBook`. +Open `book-list.component.ts` in `app\book\book-list` folder and add a variable named `selectedBook`. ```js +import { ListService, PagedResultDto } from '@abp/ng.core'; import { Component, OnInit } from '@angular/core'; -import { Select, Store } from '@ngxs/store'; -import { Observable } from 'rxjs'; -import { finalize } from 'rxjs/operators'; import { BookDto, BookType } from '../models'; -import { GetBooks, CreateUpdateBook } from '../state/book.actions'; -import { BookState } from '../state/book.state'; +import { BookService } from '../services'; import { FormGroup, FormBuilder, Validators } from '@angular/forms'; import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap'; -import { BookService } from '../services'; // <== imported BookService ==> @Component({ selector: 'app-book-list', templateUrl: './book-list.component.html', styleUrls: ['./book-list.component.scss'], - providers: [{ provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], + providers: [ListService, { provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], }) export class BookListComponent implements OnInit { - @Select(BookState.getBooks) - books$: Observable; + book = { items: [], totalCount: 0 } as PagedResultDto; booksType = BookType; @@ -1058,26 +910,24 @@ export class BookListComponent implements OnInit { (bookType) => typeof this.booksType[bookType] === 'number' ); - loading = false; - isModalOpen = false; form: FormGroup; selectedBook = {} as BookDto; // <== declared selectedBook ==> - constructor(private store: Store, private fb: FormBuilder, private bookService: BookService) {} //<== injected BookService ==> + constructor( + public readonly list: ListService, + private bookService: BookService, + private fb: FormBuilder + ) {} ngOnInit() { - this.get(); - } + const bookStreamCreator = (query) => this.bookService.getListByInput(query); - get() { - this.loading = true; - this.store - .dispatch(new GetBooks()) - .pipe(finalize(() => (this.loading = false))) - .subscribe(() => {}); + this.list.hookToQuery(bookStreamCreator).subscribe((response) => { + this.book = response; + }); } // <== this method is replaced ==> @@ -1109,30 +959,31 @@ export class BookListComponent implements OnInit { }); } + // <== this method is replaced ==> save() { if (this.form.invalid) { return; } - //<== added this.selectedBook.id ==> - this.store - .dispatch(new CreateUpdateBook(this.form.value, this.selectedBook.id)) - .subscribe(() => { - this.isModalOpen = false; - this.form.reset(); - this.get(); - }); + // <== added request ==> + const request = this.selectedBook.id + ? this.bookService.updateByIdAndInput(this.form.value, this.selectedBook.id) + : this.bookService.createByInput(this.form.value); + + request.subscribe(() => { + this.isModalOpen = false; + this.form.reset(); + this.list.get(); + }); } } ``` -* We imported `BookService`. * We declared a variable named `selectedBook` as `BookDto`. -* We injected `BookService` to the constructor. `BookService` is being used to retrieve the book data which is being edited. * We added `editBook` method. This method fetches the book with the given `Id` and sets it to `selectedBook` object. * We replaced the `buildForm` method so that it creates the form with the `selectedBook` data. * We replaced the `createBook` method so it sets `selectedBook` to an empty object. -* We added `selectedBook.id` to the constructor of the new `CreateUpdateBook`. +* We replaced the `save` method. #### Add "Actions" dropdown to the table @@ -1140,27 +991,14 @@ Open the `book-list.component.html` in `app\book\book-list` folder and replace ```html
- - - - - {%{{{ "::Actions" | abpLocalization }}}%} - {%{{{ "::Name" | abpLocalization }}}%} - {%{{{ "::Type" | abpLocalization }}}%} - {%{{{ "::PublishDate" | abpLocalization }}}%} - {%{{{ "::Price" | abpLocalization }}}%} - - - - - + + + +
-
- - {%{{{ data.name }}}%} - {%{{{ booksType[data.type] }}}%} - {%{{{ data.publishDate | date }}}%} - {%{{{ data.price }}}%} - -
+
+ + + + + {%{{{ booksType[row.type] }}}%} + + + + + {%{{{ row.publishDate | date }}}%} + + + + + {%{{{ row.price | currency }}}%} + + +
``` -- We added a `th` for the "Actions" column. +- We added a `ngx-datatable-column` for the "Actions" column. - We added `button` with `ngbDropdownToggle` to open actions when clicked the button. - We have used to [NgbDropdown](https://ng-bootstrap.github.io/#/components/dropdown/examples) for the dropdown menu of actions. @@ -1198,7 +1048,7 @@ Open `book-list.component.html` in `app\book\book-list` folder and find the ` -

{%{{{ (selectedBook.id ? 'AbpIdentity::Edit' : '::NewBook' ) | abpLocalization }}}%}

+

{%{{{ (selectedBook.id ? '::Edit' : '::NewBook' ) | abpLocalization }}}%}

``` @@ -1206,81 +1056,9 @@ Open `book-list.component.html` in `app\book\book-list` folder and find the ` -import { BookService } from '../services'; -import { tap } from 'rxjs/operators'; -import { Injectable } from '@angular/core'; -import { BookDto } from '../models'; - -export class BookStateModel { - public book: PagedResultDto; -} - -@State({ - name: 'BookState', - defaults: { book: {} } as BookStateModel, -}) -@Injectable() -export class BookState { - @Selector() - static getBooks(state: BookStateModel) { - return state.book.items || []; - } - - constructor(private bookService: BookService) {} - - @Action(GetBooks) - get(ctx: StateContext) { - return this.bookService.getListByInput().pipe( - tap((booksResponse) => { - ctx.patchState({ - book: booksResponse, - }); - }) - ); - } - - @Action(CreateUpdateBook) - save(ctx: StateContext, action: CreateUpdateBook) { - if (action.id) { - return this.bookService.updateByIdAndInput(action.payload, action.id); - } else { - return this.bookService.createByInput(action.payload); - } - } - - // <== added DeleteBook action listener ==> - @Action(DeleteBook) - delete(ctx: StateContext, action: DeleteBook) { - return this.bookService.deleteById(action.id); - } -} -``` - -- We imported `DeleteBook` . - -- We added `DeleteBook` action listener to the end of the file. - - #### Delete confirmation popup -Open `book-list.component.ts` in`app\book\book-list` folder and inject the `ConfirmationService`. +Open `book-list.component.ts` in `app\book\book-list` folder and inject the `ConfirmationService`. Replace the constructor as below: @@ -1289,11 +1067,11 @@ import { ConfirmationService } from '@abp/ng.theme.shared'; //... constructor( - private store: Store, - private fb: FormBuilder, - private bookService: BookService, - private confirmation: ConfirmationService // <== added this line ==> -) { } + public readonly list: ListService, + private bookService: BookService, + private fb: FormBuilder, + private confirmation: ConfirmationService // <== added this line ==> +) {} ``` * We imported `ConfirmationService`. @@ -1301,28 +1079,24 @@ constructor( See the [Confirmation Popup documentation](https://docs.abp.io/en/abp/latest/UI/Angular/Confirmation-Service) -In the `book-list.component.ts` add a delete method : +In the `book-list.component.ts` add a delete method: ```js -import { GetBooks, CreateUpdateBook, DeleteBook } from '../state/book.actions' ;// <== imported DeleteBook ==> - -import { ConfirmationService, Confirmation } from '@abp/ng.theme.shared'; //<== imported Confirmation ==> +import { ConfirmationService, Confirmation } from '@abp/ng.theme.shared'; //<== imported Confirmation namespace ==> //... delete(id: string) { - this.confirmation - .warn('::AreYouSureToDelete', 'AbpAccount::AreYouSure') - .subscribe(status => { - if (status === Confirmation.Status.confirm) { - this.store.dispatch(new DeleteBook(id)).subscribe(() => this.get()); - } - }); + this.confirmation.warn('::AreYouSureToDelete', 'AbpAccount::AreYouSure').subscribe((status) => { + if (status === Confirmation.Status.confirm) { + this.bookService.deleteById(id).subscribe(() => this.list.get()); + } + }); } ``` -The `delete` method shows a confirmation popup and subscribes for the user response. `DeleteBook` action dispatched only if user clicks to the `Yes` button. The confirmation popup looks like below: +The `delete` method shows a confirmation popup and subscribes for the user response. The `deleteById` method of `BookService` called only if user clicks to the `Yes` button. The confirmation popup looks like below: ![bookstore-confirmation-popup](./images/bookstore-confirmation-popup.png) @@ -1335,7 +1109,7 @@ Open `book-list.component.html` in `app\book\book-list` folder and modify the `n ```html
-
diff --git a/docs/en/Tutorials/images/bookstore-actions-buttons.png b/docs/en/Tutorials/images/bookstore-actions-buttons.png index e8243fedc7f88a85060ca27e13a10281acca59a4..f5d8f0870b88e9ffcac770a03481ac871beeccb2 100644 GIT binary patch literal 25169 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 DHD`U8 literal 29435 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 fYg-%~f_M&aj@0}w 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 diff --git a/docs/en/Tutorials/images/bookstore-angular-file-tree.png b/docs/en/Tutorials/images/bookstore-angular-file-tree.png index ffa8dcd7e2862f91d03ffb41912a83d2f0b9ecd4..d921f146fcc6011e2b1bb57549bee6b48a4e961e 100644 GIT binary patch delta 25483 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

Ez_}*2mvirl~=KAqRDIj=w8YOVk$Y?KJ_i| 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 delta 34041 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Μ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 literal 49861 zcmZ^~1zcUb(muR#cemp1?heJJxJz+&XX9FmTZ>bQySux)yUQ-_{^z{+zVh93zRg;{ zm6gmSGn18M=1GWDR+K`5$A@5-I=y>9>`+%Hv@YAuce#m>%9mv(K5+o^r9Pu!o2<9C)l9(V*Pf^iabaCOW zq+2MZ31ObvFdnbA4AQa+Nyzj;}0X5Nc`C*vUC%cz37X2F7*h zvm|Hnru_q=Whj@r)gt>Stg=|NzY^x(ig*nt0tF#HqqZV=8c(C9ixZL#$3{;t)zfcGyil`^$iaVtITnc1KM@OS}pOPw&Rz7fmVU?qaL{z^v!CS70fQ;^} z6A{v4)?h++G2v`#kxs(QKSOEAoK)R+0C!4M?os@-hc+@eh`2z88Wvh=Gq@6(V5-o* zq;K`bGRWMnl0(>FH#RZ!Fs&BI`v zVB9V+;{Z5Jg?#A3XqgrN)aIt*A)UY?pdT+9#p-3*Fd3l)La;Bnryp4seTzn#9qeo^ zBd4`6gWKdYMU}qtuztst{7%BRYwn5qDPXY623AceBlH=`{CPS1B4SFkNvTQfh+^#r z15+|Ec~ol(?vb1W%L1s)dIsQazf=}Ltr0h0gXM;>f1tq)kA~?T+L#)d-YYN5d~`S= zEZK_6vU#C7!%X@r50}dWY*$&8T=j{NT%Klr&YR%0DJsp#{aLx|(s5J^h?zF@`HE20 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 BJY@g? diff --git a/docs/en/Tutorials/images/bookstore-confirmation-popup.png b/docs/en/Tutorials/images/bookstore-confirmation-popup.png index a80b180f1cbadef03f1caca75680e7d8d692bcfa..b17e70638db3a921eac3ca99beda6a89dabecf25 100644 GIT binary patch literal 23065 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±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≤o%uGZbZ-PeHEuAT*AjTYxn2LD}5xm`wjcV55WBF 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

&HdfV}XRVHSBjTb=YU$P{E=?JfCdtAoQ8|z$ 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 From d8f7b581c3c01fb85f5ffa49d444cff9aa18ebf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 30 Jun 2020 10:59:52 +0300 Subject: [PATCH 159/190] Refactored virtual file system #4528 --- ...dFileSet.cs => AbpEmbeddedFileProvider.cs} | 4 +-- .../Embedded/EmbeddedVirtualFileSetInfo.cs | 22 +++++++++++++++ .../Abp/VirtualFileSystem/IVirtualFileSet.cs | 10 ------- .../Physical/PhysicalVirtualFileSetInfo.cs | 19 +++++++++++++ .../VirtualFilePathHelper.cs | 2 -- .../VirtualFileSystem/VirtualFileSetInfo.cs | 28 +++---------------- .../VirtualFileSetListExtensions.cs | 24 ++++++++++++---- 7 files changed, 66 insertions(+), 43 deletions(-) rename framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/{EmbeddedFileSet.cs => AbpEmbeddedFileProvider.cs} (97%) create mode 100644 framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedVirtualFileSetInfo.cs delete mode 100644 framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/IVirtualFileSet.cs create mode 100644 framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Physical/PhysicalVirtualFileSetInfo.cs diff --git a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedFileSet.cs b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/AbpEmbeddedFileProvider.cs similarity index 97% rename from framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedFileSet.cs rename to framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/AbpEmbeddedFileProvider.cs index 9c09a901dc..ae0acafe09 100644 --- a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedFileSet.cs +++ b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/AbpEmbeddedFileProvider.cs @@ -8,7 +8,7 @@ using Microsoft.Extensions.FileProviders; namespace Volo.Abp.VirtualFileSystem.Embedded { - public class EmbeddedFileSet : DictionaryBasedFileProvider + public class AbpEmbeddedFileProvider : DictionaryBasedFileProvider { [NotNull] public Assembly Assembly { get; } @@ -19,7 +19,7 @@ namespace Volo.Abp.VirtualFileSystem.Embedded protected override IDictionary Files => _files.Value; private readonly Lazy> _files; - public EmbeddedFileSet( + public AbpEmbeddedFileProvider( [NotNull] Assembly assembly, [CanBeNull] string baseNamespace = null) { diff --git a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedVirtualFileSetInfo.cs b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedVirtualFileSetInfo.cs new file mode 100644 index 0000000000..9f4d87d783 --- /dev/null +++ b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedVirtualFileSetInfo.cs @@ -0,0 +1,22 @@ +using System.Reflection; +using Microsoft.Extensions.FileProviders; + +namespace Volo.Abp.VirtualFileSystem.Embedded +{ + public class EmbeddedVirtualFileSetInfo : VirtualFileSetInfo + { + public Assembly Assembly { get; } + + public string BaseFolder { get; } + + public EmbeddedVirtualFileSetInfo( + IFileProvider fileProvider, + Assembly assembly, + string baseFolder = null) + : base(fileProvider) + { + Assembly = assembly; + BaseFolder = baseFolder; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/IVirtualFileSet.cs b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/IVirtualFileSet.cs deleted file mode 100644 index 1880165d02..0000000000 --- a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/IVirtualFileSet.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Collections.Generic; -using Microsoft.Extensions.FileProviders; - -namespace Volo.Abp.VirtualFileSystem -{ - public interface IVirtualFileSet - { - void AddFiles(Dictionary files); - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Physical/PhysicalVirtualFileSetInfo.cs b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Physical/PhysicalVirtualFileSetInfo.cs new file mode 100644 index 0000000000..525fa178d6 --- /dev/null +++ b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Physical/PhysicalVirtualFileSetInfo.cs @@ -0,0 +1,19 @@ +using JetBrains.Annotations; +using Microsoft.Extensions.FileProviders; + +namespace Volo.Abp.VirtualFileSystem.Physical +{ + public class PhysicalVirtualFileSetInfo : VirtualFileSetInfo + { + public string Root { get; } + + public PhysicalVirtualFileSetInfo( + [NotNull] IFileProvider fileProvider, + [NotNull] string root + ) + : base(fileProvider) + { + Root = Check.NotNullOrWhiteSpace(root, nameof(root)); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFilePathHelper.cs b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFilePathHelper.cs index 03f851a7e3..47900d5aa9 100644 --- a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFilePathHelper.cs +++ b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFilePathHelper.cs @@ -6,8 +6,6 @@ namespace Volo.Abp.VirtualFileSystem { internal static class VirtualFilePathHelper { - //TODO: Optimize this class! - public static string NormalizePath(string fullPath) { if (fullPath.Equals("/", StringComparison.Ordinal)) diff --git a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetInfo.cs b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetInfo.cs index b425932c51..694729f02a 100644 --- a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetInfo.cs +++ b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetInfo.cs @@ -1,35 +1,15 @@ -using System.IO; -using System.Reflection; +using JetBrains.Annotations; using Microsoft.Extensions.FileProviders; namespace Volo.Abp.VirtualFileSystem { public class VirtualFileSetInfo { - public IFileProvider FileProvider - { - get => _fileProvider; - set => _fileProvider = Check.NotNull(value, nameof(value)); - } - private IFileProvider _fileProvider; - - public VirtualFileSetInfo(IFileProvider fileProvider) - { - FileProvider = fileProvider; - } - } - - public class EmbeddedVirtualFileSetInfo : VirtualFileSetInfo - { - public Assembly Assembly { get; } - - public string BaseFolder { get; } + public IFileProvider FileProvider { get; } - public EmbeddedVirtualFileSetInfo(IFileProvider fileProvider, Assembly assembly, string baseFolder = null) - : base(fileProvider) + public VirtualFileSetInfo([NotNull] IFileProvider fileProvider) { - Assembly = assembly; - BaseFolder = baseFolder; + FileProvider = Check.NotNull(fileProvider, nameof(fileProvider)); } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetListExtensions.cs b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetListExtensions.cs index ebf745916d..f1ca9749ea 100644 --- a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetListExtensions.cs +++ b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetListExtensions.cs @@ -3,7 +3,9 @@ using System.IO; using System.Reflection; using JetBrains.Annotations; using Microsoft.Extensions.FileProviders; +using Microsoft.Extensions.FileProviders.Physical; using Volo.Abp.VirtualFileSystem.Embedded; +using Volo.Abp.VirtualFileSystem.Physical; namespace Volo.Abp.VirtualFileSystem { @@ -26,6 +28,18 @@ namespace Volo.Abp.VirtualFileSystem list.Add(new EmbeddedVirtualFileSetInfo(fileProvider, assembly, baseFolder)); } + public static void AddPhysical( + [NotNull] this VirtualFileSetList list, + [NotNull] string root, + ExclusionFilters exclusionFilters = ExclusionFilters.Sensitive) + { + Check.NotNull(list, nameof(list)); + Check.NotNullOrWhiteSpace(root, nameof(root)); + + var fileProvider = new PhysicalFileProvider(root, exclusionFilters); + list.Add(new PhysicalVirtualFileSetInfo(fileProvider, root)); + } + private static IFileProvider CreateFileProvider( [NotNull] Assembly assembly, [CanBeNull] string baseNamespace = null, @@ -37,7 +51,7 @@ namespace Volo.Abp.VirtualFileSystem if (info == null) { - return new EmbeddedFileSet(assembly, baseNamespace); + return new AbpEmbeddedFileProvider(assembly, baseNamespace); } if (baseFolder == null) @@ -50,10 +64,10 @@ namespace Volo.Abp.VirtualFileSystem public static void ReplaceEmbeddedByPhysical( [NotNull] this VirtualFileSetList fileSets, - [NotNull] string pyhsicalPath) + [NotNull] string physicalPath) { Check.NotNull(fileSets, nameof(fileSets)); - Check.NotNullOrWhiteSpace(pyhsicalPath, nameof(pyhsicalPath)); + Check.NotNullOrWhiteSpace(physicalPath, nameof(physicalPath)); var assembly = typeof(T).Assembly; @@ -62,14 +76,14 @@ namespace Volo.Abp.VirtualFileSystem if (fileSets[i] is EmbeddedVirtualFileSetInfo embeddedVirtualFileSet && embeddedVirtualFileSet.Assembly == assembly) { - var thisPath = pyhsicalPath; + var thisPath = physicalPath; if (!embeddedVirtualFileSet.BaseFolder.IsNullOrEmpty()) { thisPath = Path.Combine(thisPath, embeddedVirtualFileSet.BaseFolder); } - fileSets[i] = new VirtualFileSetInfo(new PhysicalFileProvider(thisPath)); + fileSets[i] = new PhysicalVirtualFileSetInfo(new PhysicalFileProvider(thisPath), thisPath); } } } From 8a18b82bf4fabba4029fd61b04ee285ced0d5c0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 30 Jun 2020 11:02:29 +0300 Subject: [PATCH 160/190] #4528 rollback commits done by mistake. --- .../MyCompanyName.MyProjectName.Domain.Shared.csproj | 6 ------ .../MyFolder/{Person.Name}.txt | 1 - 2 files changed, 7 deletions(-) delete mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyFolder/{Person.Name}.txt diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj index 72ba0ec00f..82669a56ee 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj @@ -5,7 +5,6 @@ netstandard2.0 MyCompanyName.MyProjectName - true @@ -24,9 +23,4 @@ - - - - - diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyFolder/{Person.Name}.txt b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyFolder/{Person.Name}.txt deleted file mode 100644 index d61a270d39..0000000000 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyFolder/{Person.Name}.txt +++ /dev/null @@ -1 +0,0 @@ -testing just... \ No newline at end of file From 7c1b93e180f23d06ef580a921dc27b0dcefebd26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 30 Jun 2020 11:12:17 +0300 Subject: [PATCH 161/190] Update MyProjectNameIdentityServerModule.cs --- .../MyProjectNameIdentityServerModule.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs index caa21c9706..1da9619803 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs @@ -77,8 +77,6 @@ namespace MyCompanyName.MyProjectName { Configure(options => { - options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}MyCompanyName.MyProjectName.Domain.Shared")); - options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}MyCompanyName.MyProjectName.Domain")); // options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.UI", Path.DirectorySeparatorChar))); options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.AspNetCore.Mvc.UI", Path.DirectorySeparatorChar))); @@ -87,6 +85,8 @@ namespace MyCompanyName.MyProjectName options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", Path.DirectorySeparatorChar))); options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}modules{0}account{0}src{0}Volo.Abp.Account.Web", Path.DirectorySeparatorChar))); // + options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}MyCompanyName.MyProjectName.Domain.Shared")); + options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}MyCompanyName.MyProjectName.Domain")); }); } From c9a25fec97dff3c94f35bc4f3961e82decd656aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 30 Jun 2020 11:20:17 +0300 Subject: [PATCH 162/190] =?UTF-8?q?#4528=C2=A0configure=20startup=20templa?= =?UTF-8?q?tes=20to=20use=20the=20GenerateEmbeddedFilesManifest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MyCompanyName.MyProjectName.Domain.Shared.csproj | 5 +++++ .../MyProjectNameDomainSharedModule.cs | 2 +- .../MyCompanyName.MyProjectName.Domain.Shared.csproj | 5 +++++ .../MyProjectNameDomainSharedModule.cs | 2 +- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj index 82669a56ee..df627353c0 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj @@ -5,6 +5,7 @@ netstandard2.0 MyCompanyName.MyProjectName + true @@ -23,4 +24,8 @@ + + + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs index 340d28ac3a..7fb1e30637 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs @@ -35,7 +35,7 @@ namespace MyCompanyName.MyProjectName { Configure(options => { - options.FileSets.AddEmbedded("MyCompanyName.MyProjectName"); + options.FileSets.AddEmbedded(); }); Configure(options => diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj index 3483fb41cd..526c13a2e4 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj @@ -5,12 +5,17 @@ netstandard2.0 MyCompanyName.MyProjectName + true + + + + diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs index 384aae162a..081ccfb739 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs @@ -17,7 +17,7 @@ namespace MyCompanyName.MyProjectName { Configure(options => { - options.FileSets.AddEmbedded("MyCompanyName.MyProjectName"); + options.FileSets.AddEmbedded(); }); Configure(options => From 02b563bc9f21d8a473da41715d2099883ac484c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 30 Jun 2020 11:20:21 +0300 Subject: [PATCH 163/190] Update tr.json --- .../Localization/MyProjectName/tr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/tr.json b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/tr.json index 2b48193353..8decb5134e 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/tr.json +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/tr.json @@ -1,6 +1,6 @@ { "culture": "tr", "texts": { - "ManageYourProfile": "Profil yönetimi" + "ManageYourProfile": "Profil yönetimi" } } \ No newline at end of file From d26741b6e079998b79f674b73b5c20a748ffc085 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 30 Jun 2020 11:51:54 +0300 Subject: [PATCH 164/190] docs: add info on theme shared and suggest removing shared --- docs/en/UI/Angular/Migration-Guide-v3.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/UI/Angular/Migration-Guide-v3.md b/docs/en/UI/Angular/Migration-Guide-v3.md index e1929acd52..f085eb4406 100644 --- a/docs/en/UI/Angular/Migration-Guide-v3.md +++ b/docs/en/UI/Angular/Migration-Guide-v3.md @@ -198,6 +198,7 @@ export class AppRoutingModule {} - Remove config packages from your project using `yarn remove`. - Import config modules from secondary entry points (e.g. `@abp/ng.identity/config`). - Call static `forRoot` method of all new config modules, even if a configuration is not passed. +- Call static `forRoot` method of `ThemeSharedModule` and remove `SharedModule` from imports (unless you have added anything that is necessary for your root module in it). - Import lazy ABP modules directly in app routing module (e.g. `() => import('@abp/ng.identity').then(...)`). - Call static `forLazy` method of all lazy modules inside `then`, even if a configuration is not passed. - [OPTIONAL] Add an empty parent route with `DynamicLayoutComponent` for better performance and UX. From 640dd6cc021ec3f38a0484b332e9dfffa9772bab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ak=C4=B1n=20Sabri=20=C3=87am?= Date: Tue, 30 Jun 2020 12:00:08 +0300 Subject: [PATCH 165/190] added notes tab title localization key for organizations in abp io admin --- .../AbpIoLocalization/Admin/Localization/Resources/en.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index 9bd9521862..a07b35c66b 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -165,6 +165,7 @@ "RemainingQuestionCount": "Remaining question count", "TotalQuestionMustBeGreaterWarningMessage": "TotalQuestionCount must be greater than RemainingQuestionCount !", "QuestionCountsMustBeGreaterThanZero": "TotalQuestionCount and RemainingQuestionCount must be zero or greater than zero !", - "UnlimitedQuestionCount": "Unlimited question count" + "UnlimitedQuestionCount": "Unlimited question count", + "Notes": "Notes" } } \ No newline at end of file From f532b2f6ad1aceed97c155721a196b76d7c1d986 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 30 Jun 2020 12:00:16 +0300 Subject: [PATCH 166/190] docs: replace ThemeShared warning with ThemeBasic --- docs/en/UI/Angular/Migration-Guide-v3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/UI/Angular/Migration-Guide-v3.md b/docs/en/UI/Angular/Migration-Guide-v3.md index f085eb4406..82ea951d65 100644 --- a/docs/en/UI/Angular/Migration-Guide-v3.md +++ b/docs/en/UI/Angular/Migration-Guide-v3.md @@ -198,7 +198,7 @@ export class AppRoutingModule {} - Remove config packages from your project using `yarn remove`. - Import config modules from secondary entry points (e.g. `@abp/ng.identity/config`). - Call static `forRoot` method of all new config modules, even if a configuration is not passed. -- Call static `forRoot` method of `ThemeSharedModule` and remove `SharedModule` from imports (unless you have added anything that is necessary for your root module in it). +- Call static `forRoot` method of `ThemeBasicModule` (or `ThemeLeptonModule` if commercial) and remove `SharedModule` from imports (unless you have added anything that is necessary for your root module in it). - Import lazy ABP modules directly in app routing module (e.g. `() => import('@abp/ng.identity').then(...)`). - Call static `forLazy` method of all lazy modules inside `then`, even if a configuration is not passed. - [OPTIONAL] Add an empty parent route with `DynamicLayoutComponent` for better performance and UX. From b81e420b9d0368ebaa655784f2304c07f9e3c71b Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 30 Jun 2020 12:04:00 +0300 Subject: [PATCH 167/190] docs: add description for ngx-datatable styles --- docs/en/UI/Angular/Migration-Guide-v3.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/docs/en/UI/Angular/Migration-Guide-v3.md b/docs/en/UI/Angular/Migration-Guide-v3.md index 82ea951d65..fd94304f34 100644 --- a/docs/en/UI/Angular/Migration-Guide-v3.md +++ b/docs/en/UI/Angular/Migration-Guide-v3.md @@ -237,6 +237,26 @@ Until v3, we had been using a custom component, `abp-table`, as the default tabl As of ABP v3, we have switched to a battle-tested, well-executed data grid: [ngx-datatable](https://github.com/swimlane/ngx-datatable). All ABP modules will come with ngx-datatable already implemented in them. `ThemeSharedModule` already exports `NgxDatatableModule`. So, if you install the package by running `yarn add @swimlane/ngx-datatable` in your terminal, it will be available for use in all modules of your app. +For proper styling, you need to add the following in the styles section of your angular.json file: + +```json + { + "input": "node_modules/@swimlane/ngx-datatable/index.css", + "inject": true, + "bundleName": "ngx-datatable-index" + }, + { + "input": "node_modules/@swimlane/ngx-datatable/assets/icons.css", + "inject": true, + "bundleName": "ngx-datatable-icons" + }, + { + "input": "node_modules/@swimlane/ngx-datatable/themes/material.css", + "inject": true, + "bundleName": "ngx-datatable-material" + } +``` + Since `abp-table` is not dropped yet, modules previously built by ABP v2.x will not suddenly lose all their tables. Yet, they will look and feel different from built-in ABP v3 modules. Therefore, you will probably want to convert the tables in those modules to ngx-datatable. In order to decrease the amount of work required to convert an abp-table into ngx-datatable, we have modified the [ListService](./List-Service.md) to work well with ngx-datatable and [introduced](https://volosoft.com/blog/attribute-directives-to-avoid-repetition-in-angular-templates) two new directives: `NgxDatatableListDirective` and `NgxDatatableDefaultDirective`. The usage of those directives is rather simple: @@ -327,6 +347,8 @@ Once you bind the injected `ListService` instance through `NgxDatatableListDirec #### What to Do When Migrating? +- Install `@swimlane/ngx-datatable` package. +- Add ngx-datatable styles in the angular.json file. - If you can, update your modules according to the example above. - If you have to do that later and are planning to keep abp-table for a while, make sure you update your pagination according to the [breaking change described here](./List-Service.md). From 30611e0b94142f5c28284003d0eb669de1d4532c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 30 Jun 2020 12:05:35 +0300 Subject: [PATCH 168/190] #4528 Add GenerateEmbeddedFilesManifest to the module web project --- .../MyProjectNameApplicationContractsModule.cs | 9 +-------- .../Localization/MyProjectName/en.json | 3 ++- .../Localization/MyProjectName/tr.json | 3 ++- .../MyCompanyName.MyProjectName.Web.csproj | 5 +++++ .../MyProjectNameWebModule.cs | 2 +- .../Pages/MyProjectName/Index.cshtml | 5 ++++- 6 files changed, 15 insertions(+), 12 deletions(-) diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/MyProjectNameApplicationContractsModule.cs b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/MyProjectNameApplicationContractsModule.cs index 5df67ff031..eda0387654 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/MyProjectNameApplicationContractsModule.cs +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/MyProjectNameApplicationContractsModule.cs @@ -1,6 +1,5 @@ using Volo.Abp.Application; using Volo.Abp.Modularity; -using Volo.Abp.VirtualFileSystem; using Volo.Abp.Authorization; namespace MyCompanyName.MyProjectName @@ -12,12 +11,6 @@ namespace MyCompanyName.MyProjectName )] public class MyProjectNameApplicationContractsModule : AbpModule { - public override void ConfigureServices(ServiceConfigurationContext context) - { - Configure(options => - { - options.FileSets.AddEmbedded("MyCompanyName.MyProjectName"); - }); - } + } } diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/en.json b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/en.json index 4682353878..967ce2a906 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/en.json +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/en.json @@ -1,6 +1,7 @@ { "culture": "en", "texts": { - "ManageYourProfile": "Manage your profile" + "ManageYourProfile": "Manage your profile", + "SamplePageMessage": "A sample page for the MyProjectName module" } } \ No newline at end of file diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/tr.json b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/tr.json index 8decb5134e..0f4fa93fc6 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/tr.json +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/tr.json @@ -1,6 +1,7 @@ { "culture": "tr", "texts": { - "ManageYourProfile": "Profil yönetimi" + "ManageYourProfile": "Profil yönetimi", + "SamplePageMessage": "MyProjectName modulünden örnek bir sayfa" } } \ No newline at end of file diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj index d02d094f43..e47d2294ba 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj @@ -8,6 +8,7 @@ true Library MyCompanyName.MyProjectName.Web + true @@ -19,6 +20,10 @@ + + + + diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs index 48f59634c7..04ce36df22 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs @@ -41,7 +41,7 @@ namespace MyCompanyName.MyProjectName.Web Configure(options => { - options.FileSets.AddEmbedded("MyCompanyName.MyProjectName.Web"); + options.FileSets.AddEmbedded(); }); context.Services.AddAutoMapperObjectMapper(); diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Pages/MyProjectName/Index.cshtml b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Pages/MyProjectName/Index.cshtml index 9f0c822fdf..5807d89d9a 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Pages/MyProjectName/Index.cshtml +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Pages/MyProjectName/Index.cshtml @@ -1,6 +1,9 @@ @page +@using Microsoft.Extensions.Localization +@using MyCompanyName.MyProjectName.Localization @model MyCompanyName.MyProjectName.Web.Pages.MyProjectName.IndexModel +@inject IStringLocalizer L @{ }

MyProjectName

-

A sample page for the MyProjectName module.

+

@L["SamplePageMessage"]

From c3f82fa8848fe9f06da386ee91fc3cb93204264d Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 30 Jun 2020 12:06:27 +0300 Subject: [PATCH 169/190] docs: refer to deprecation issue --- docs/en/UI/Angular/Migration-Guide-v3.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/en/UI/Angular/Migration-Guide-v3.md b/docs/en/UI/Angular/Migration-Guide-v3.md index fd94304f34..8690e58165 100644 --- a/docs/en/UI/Angular/Migration-Guide-v3.md +++ b/docs/en/UI/Angular/Migration-Guide-v3.md @@ -355,6 +355,15 @@ Once you bind the injected `ListService` instance through `NgxDatatableListDirec **Important Note:** The `abp-table` is not removed, but is deprecated and will be removed in the future. Please consider switching to ngx-datatable. +### Deprecated Interfaces + +Some interfaces have long been marked as deprectaed and now they are removed. + +#### What to Do When Migrating? + +- Please check if you are still using [anything listed in this issue](https://github.com/abpframework/abp/issues/4281) + + ## What's Next? * [Service Proxies](./Service-Proxies.md) From e8c2b471003c835d2ec625bdf395891040093b3e Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 30 Jun 2020 12:07:26 +0300 Subject: [PATCH 170/190] docs: fix typo --- docs/en/UI/Angular/Migration-Guide-v3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/UI/Angular/Migration-Guide-v3.md b/docs/en/UI/Angular/Migration-Guide-v3.md index 8690e58165..f241469193 100644 --- a/docs/en/UI/Angular/Migration-Guide-v3.md +++ b/docs/en/UI/Angular/Migration-Guide-v3.md @@ -357,7 +357,7 @@ Once you bind the injected `ListService` instance through `NgxDatatableListDirec ### Deprecated Interfaces -Some interfaces have long been marked as deprectaed and now they are removed. +Some interfaces have long been marked as deprecated and now they are removed. #### What to Do When Migrating? From 97475c0fcd55bbee66fd93c38bf55e7397919eba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 30 Jun 2020 13:00:43 +0300 Subject: [PATCH 171/190] Improve the virtual file system document --- docs/en/Virtual-File-System.md | 180 ++++++++++++++++++--------------- 1 file changed, 99 insertions(+), 81 deletions(-) diff --git a/docs/en/Virtual-File-System.md b/docs/en/Virtual-File-System.md index c5a154bd3c..a519b02ec6 100644 --- a/docs/en/Virtual-File-System.md +++ b/docs/en/Virtual-File-System.md @@ -1,40 +1,30 @@ -## Virtual File System +# Virtual File System The Virtual File System makes it possible to manage files that do not physically exist on the file system (disk). It's mainly used to embed (js, css, image..) files into assemblies and use them like physical files at runtime. -### Volo.Abp.VirtualFileSystem Package +## Installation -Volo.Abp.VirtualFileSystem is the core package of the virtual file system. Install it in your project using the package manager console (PMC): +> Most of the times you don't need to manually install this package since it comes pre-installed with the [application startup template](Startup-Templates/Application.md). -``` -Install-Package Volo.Abp.VirtualFileSystem -``` +[Volo.Abp.VirtualFileSystem](https://www.nuget.org/packages/Volo.Abp.VirtualFileSystem) is the main page of the Virtual File System. -> This package is already installed by default with the startup template. So, most of the time, you will not need to install it manually. +Use the ABP CLI to add this package to your project: -Then you can add **AbpVirtualFileSystemModule** dependency to your module: +* Install the [ABP CLI](https://docs.abp.io/en/abp/latest/CLI), if you haven't installed it. +* Open a command line (terminal) in the directory of the `.csproj` file you want to add the `Volo.Abp.VirtualFileSystem` package. +* Run `abp add-package Volo.Abp.VirtualFileSystem` command. -```c# -using Volo.Abp.Modularity; -using Volo.Abp.VirtualFileSystem; +If you want to do it manually, install the [Volo.Abp.VirtualFileSystem](https://www.nuget.org/packages/Volo.Abp.VirtualFileSystem) NuGet package to your project and add `[DependsOn(typeof(AbpVirtualFileSystemModule))]` to the [ABP module](Module-Development-Basics.md) class inside your project. -namespace MyCompany.MyProject -{ - [DependsOn(typeof(AbpVirtualFileSystemModule))] - public class MyModule : AbpModule - { - //... - } -} -``` +## Working with the Embedded Files -#### Registering Embedded Files +### Embed the Files -A file should be first marked as an embedded resource to embed the file into the assembly. The easiest way to do it is to select the file from the **Solution Explorer** and set **Build Action** to **Embedded Resource** from the **Properties** window. Example: +A file should be first marked as an **embedded resource** to embed the file into the assembly. The easiest way to do it is to select the file from the **Solution Explorer** and set **Build Action** to **Embedded Resource** from the **Properties** window. Example: ![build-action-embedded-resource-sample](images/build-action-embedded-resource-sample.png) -If you want to add multiple files, this can be tedious. Alternatively, you can directly edit your **.csproj** file: +If you want to add multiple files, this can be tedious. Alternatively, you can directly edit your `.csproj` file: ````C# @@ -45,76 +35,60 @@ If you want to add multiple files, this can be tedious. Alternatively, you can d This configuration recursively adds all files under the **MyResources** folder of the project (including the files you will add in the future). -Then the module needs to be configured using `AbpVirtualFileSystemOptions` to register the embedded files to the virtual file system. Example: +Embedding a file in the project/assembly may cause problems if a file name contains some special chars. To overcome this limitation; -````C# -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.Modularity; -using Volo.Abp.VirtualFileSystem; +1. Add [Microsoft.Extensions.FileProviders.Embedded](https://www.nuget.org/packages/Microsoft.Extensions.FileProviders.Embedded) NuGet package to the project that contains the embedded resource(s). +2. Add `true` into the `...` section of your `.csproj` file. -namespace MyCompany.MyProject -{ - [DependsOn(typeof(AbpVirtualFileSystemModule))] - public class MyModule : AbpModule - { - public override void ConfigureServices(ServiceConfigurationContext context) - { - Configure(options => - { - //Register all embedded files of this assembly to the virtual file system - options.FileSets.AddEmbedded("YourRootNameSpace"); - }); +> While these two steps are optional and ABP can work without these configuration, it is strongly suggested to make it. - //... - } - } -} -```` +### Configure the AbpVirtualFileSystemOptions -The `AddEmbedded` extension method takes a class, finds all embedded files from the assembly of the given class and registers them to the virtual file system. More concisely it could be written as follows: +Use `AbpVirtualFileSystemOptions` [options class](Options.md) to register the embedded files to the virtual file system in the `ConfigureServices` method of your [module](Module-Development-Basics.md). -````C# -options.FileSets.Add( - new EmbeddedFileSet(typeof(MyModule).Assembly), "YourRootNameSpace"); +**Example: Add embedded files to the virtual file system** + +````csharp +Configure(options => +{ + options.FileSets.AddEmbedded(); +}); ```` -> "YourRootNameSpace" is the root namespace of your project. It can be empty if your root namespace is empty. +The `AddEmbedded` extension method takes a class, finds all embedded files from the **assembly of the given class** and registers them to the virtual file system. It is common to pass the module class as the generic argument. -#### Getting Virtual Files: IVirtualFileProvider +`AddEmbedded` can get two optional parameters; -After embedding a file into an assembly and registering it to the virtual file system, the `IVirtualFileProvider` interface can be used to get files or directory contents: +* `baseNamespace`: This may only needed if you didn't configure the `GenerateEmbeddedFilesManifest` step explained above and your root namespace is not empty. In this case, set your root namespace here. +* `baseFolder`: If you don't want to expose all embedded files in the project, but only want to expose a specific folder (and sub folders/files), then you can set the base folder relative to your project root page. -````C# -public class MyService +**Example: Add files under the `MyFiles` folder in the project** + +````csharp +Configure(options => { - private readonly IVirtualFileProvider _virtualFileProvider; + options.FileSets.AddEmbedded( + baseNamespace: "Acme.BookStore.MyFiles", + baseFolder: "/MyFiles" + ); +}); +```` - public MyService(IVirtualFileProvider virtualFileProvider) - { - _virtualFileProvider = virtualFileProvider; - } +This example assumes; - public void Foo() - { - //Getting a single file - var file = _virtualFileProvider.GetFileInfo("/MyResources/js/test.js"); - var fileContent = file.ReadAsString(); //ReadAsString is an extension method of ABP +* Your project root (default) namespace is `Acme.BookStore`. +* Your project has a folder, named `MyFiles` +* You only want to add `MyFiles` folder to the virtual file system. - //Getting all files/directories under a directory - var directoryContents = _virtualFileProvider.GetDirectoryContents("/MyResources/js"); - } -} -```` +### Dealing With Embedded Files During Development -#### Dealing With Embedded Files During Development - -Embedding a file into a module assembly and being able to use it from another project just by referencing the assembly (or adding a nuget package) is invaluable for creating a re-usable module. However, it does make it a little bit harder to develop the module itself. +Embedding a file into an assembly and being able to use it from another project just by referencing the assembly (or adding a NuGet package) is invaluable for creating a re-usable module. However, it makes it a little bit harder to develop the module itself. Let's assume that you're developing a module that contains an embedded JavaScript file. Whenever you change this file you must re-compile the project, re-start the application and refresh the browser page to take the change. Obviously, this is very time consuming and tedious. What is needed is the ability for the application to directly use the physical file at development time and a have a browser refresh reflect any change made in the JavaScript file. The `ReplaceEmbeddedByPhysical` method makes all this possible. -The example below shows an application that depends on a module (`MyModule`) that itself contains embedded files. The application can reach the source code of the module at development time. +The example below shows an application that depends on a module (`MyModule`) that itself contains embedded files. The application can reach the source code of the module at development time. ````C# [DependsOn(typeof(MyModule))] @@ -128,29 +102,63 @@ public class MyWebAppModule : AbpModule { Configure(options => { - //ReplaceEmbeddedByPhysical gets the root folder of the MyModule project options.FileSets.ReplaceEmbeddedByPhysical( - Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}MyModuleProject", Path.DirectorySeparatorChar)) + Path.Combine( + hostingEnvironment.ContentRootPath, + string.Format( + "..{0}MyModuleProject", + Path.DirectorySeparatorChar + ) + ) ); }); } - - //... } } ```` The code above assumes that `MyWebAppModule` and `MyModule` are two different projects in a Visual Studio solution and `MyWebAppModule` depends on the `MyModule`. -### ASP.NET Core Integration +> The [application startup template](Startup-Templates/Application.md) already uses this technique for the localization files. So, when you change a localization file it automatically detects the change. + +## IVirtualFileProvider + +After embedding a file into an assembly and registering it to the virtual file system, the `IVirtualFileProvider` interface can be used to get files or directory contents: + +````C# +public class MyService +{ + private readonly IVirtualFileProvider _virtualFileProvider; + + public MyService(IVirtualFileProvider virtualFileProvider) + { + _virtualFileProvider = virtualFileProvider; + } + + public void Foo() + { + //Getting a single file + var file = _virtualFileProvider + .GetFileInfo("/MyResources/js/test.js"); + + var fileContent = file.ReadAsString(); + + //Getting all files/directories under a directory + var directoryContents = _virtualFileProvider + .GetDirectoryContents("/MyResources/js"); + } +} +```` + +## ASP.NET Core Integration The Virtual File System is well integrated to ASP.NET Core: * Virtual files can be used just like physical (static) files in a web application. * Js, css, image files and all other web content types can be embedded into assemblies and used just like the physical files. -* An application (or another module) can override a virtual file of a module just like placing a file with the same name and extension into the same folder of the virtual file. +* An application (or another module) can **override a virtual file** of a module just like placing a file with the same name and extension into the same folder of the virtual file. -#### Virtual Files Middleware +### UseVirtualFiles Middleware The Virtual Files Middleware is used to serve embedded (js, css, image...) files to clients/browsers just like physical files in the **wwwroot** folder. Add it just after the static file middleware as shown below: @@ -160,4 +168,14 @@ app.UseVirtualFiles(); Adding virtual files middleware after the static files middleware makes it possible to override a virtual file with a real physical file simply by placing it in the same location as the virtual file. ->The Virtual File Middleware only serves the virtual wwwroot folder contents - just like the other static files. +> `UseVirtualFiles()` is already configured for the [application startup template](Startup-Templates/Application.md). + +#### Static Virtual File Folders + +By default, ASP.NET Core only allows the `wwwroot` folder to contain the static files consumed by the clients. When you use the `UseVirtualFiles` middleware, the following folders also can contain static files: + +* Pages +* Views +* Themes + +This allows to add `.js`, `.css`... files near to your `.cshtml` file that is easier to develop and maintain your project. \ No newline at end of file From 9d5fe58ddd0fa3e461c6632ec6643b07c7ae4172 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 30 Jun 2020 15:09:07 +0300 Subject: [PATCH 172/190] cli npm update: directly set "preview" as version --- .../Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs index 752adad54e..2eea4558be 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs @@ -233,6 +233,8 @@ namespace Volo.Abp.Cli.ProjectModification if (includePreviews || (!switchToStable && currentVersion.Contains("-preview"))) { + // We directly set "preview" version and no longer get the latest preview from myGet. + /* if (_myGetApiResponse == null) { _myGetApiResponse = await _myGetPackageListFinder.GetPackagesAsync(); @@ -243,6 +245,9 @@ namespace Volo.Abp.Cli.ProjectModification { newVersion = mygetPackage.Versions.Last(); } + */ + + newVersion = "preview"; } else { From 2919caf118db3e59b5d312517f6abb8697f5df82 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 30 Jun 2020 15:15:11 +0300 Subject: [PATCH 173/190] refactor NpmPackagesUpdater --- .../ProjectModification/NpmPackagesUpdater.cs | 51 ++++++------------- 1 file changed, 16 insertions(+), 35 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs index 2eea4558be..be5b553744 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs @@ -202,16 +202,22 @@ namespace Volo.Abp.Cli.ProjectModification { var currentVersion = (string) package.Value; - var version = await GetLatestVersion(package, currentVersion, includePreviews, switchToStable); - - var versionWithPrefix = $"~{version}"; + var version = ""; + if (includePreviews || (!switchToStable && currentVersion.Contains("-preview"))) + { + version = "preview"; + } + else + { + version = await GetLatestVersion(package); + } - if (versionWithPrefix == currentVersion) + if (version == currentVersion) { return false; } - package.Value.Replace(versionWithPrefix); + package.Value.Replace(version); Logger.LogInformation( $"Updated {package.Name} to {version} in {filePath.Replace(Directory.GetCurrentDirectory(), "")}."); @@ -219,44 +225,19 @@ namespace Volo.Abp.Cli.ProjectModification } protected virtual async Task GetLatestVersion( - JProperty package, - string currentVersion, - bool includePreviews = false, - bool switchToStable = false) + JProperty package) { if (_fileVersionStorage.ContainsKey(package.Name)) { return _fileVersionStorage[package.Name]; } - var newVersion = currentVersion; - - if (includePreviews || (!switchToStable && currentVersion.Contains("-preview"))) - { - // We directly set "preview" version and no longer get the latest preview from myGet. - /* - if (_myGetApiResponse == null) - { - _myGetApiResponse = await _myGetPackageListFinder.GetPackagesAsync(); - } - - var mygetPackage = _myGetApiResponse.Packages.FirstOrDefault(p => p.Id == package.Name); - if (mygetPackage != null) - { - newVersion = mygetPackage.Versions.Last(); - } - */ - - newVersion = "preview"; - } - else - { - newVersion = CmdHelper.RunCmdAndGetOutput($"npm show {package.Name} version"); - } + var newVersion = CmdHelper.RunCmdAndGetOutput($"npm show {package.Name} version"); + var newVersionWithPrefix = $"~{newVersion}"; - _fileVersionStorage[package.Name] = newVersion; + _fileVersionStorage[package.Name] = newVersionWithPrefix; - return newVersion; + return $"~{newVersionWithPrefix}"; } protected virtual List GetAbpPackagesFromPackageJson(JObject fileObject) From 1b23184861a4f779ba8919985ade5f16c56e22a1 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 30 Jun 2020 15:49:39 +0300 Subject: [PATCH 174/190] fix: do not include children in flat routes --- .../packages/core/src/lib/handlers/routes.handler.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/handlers/routes.handler.ts b/npm/ng-packs/packages/core/src/lib/handlers/routes.handler.ts index 637f7b4165..9ddc03e493 100644 --- a/npm/ng-packs/packages/core/src/lib/handlers/routes.handler.ts +++ b/npm/ng-packs/packages/core/src/lib/handlers/routes.handler.ts @@ -20,7 +20,7 @@ export class RoutesHandler { return; } - const routes = flatRoutes([{ ...data.routes, path }], { path: '' }); + const routes = flatRoutes([{ path, ...data.routes }], { path: '' }); this.routes.add(routes); }); } @@ -30,13 +30,13 @@ function flatRoutes(routes: RouteDef[], parent: any) { if (!routes) return []; return routes.reduce((acc, route) => { - const current = { + const { children, ...current } = { ...route, parentName: parent.name, - path: parent.path + '/' + route.path, + path: (parent.path + '/' + route.path).replace(/\/\//g, '/'), }; - acc.push(current, ...flatRoutes(current.children, current)); + acc.push(current, ...flatRoutes(children, current)); return acc; }, []); From 656081b4b01ca8be8a0bb416b95a3d21dcc470b3 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 30 Jun 2020 16:03:29 +0300 Subject: [PATCH 175/190] test: add roles to mock config state --- .../core/src/lib/tests/config-state.service.spec.ts | 7 ++++--- .../packages/core/src/lib/tests/config.state.spec.ts | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/tests/config-state.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/config-state.service.spec.ts index a34e3eaa4e..4b0c9aa682 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/config-state.service.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/config-state.service.spec.ts @@ -1,9 +1,9 @@ import { createServiceFactory, SpectatorService, SpyObject } from '@ngneat/spectator/jest'; -import { ConfigStateService } from '../services/config-state.service'; -import { ConfigState } from '../states'; import { Store } from '@ngxs/store'; -import { Config } from '../models/config'; import * as ConfigActions from '../actions'; +import { Config } from '../models/config'; +import { ConfigStateService } from '../services/config-state.service'; +import { ConfigState } from '../states'; const CONFIG_STATE_DATA = { environment: { @@ -86,6 +86,7 @@ const CONFIG_STATE_DATA = { tenantId: null, userName: null, email: null, + roles: [], }, features: { values: {}, diff --git a/npm/ng-packs/packages/core/src/lib/tests/config.state.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/config.state.spec.ts index 5966ba0728..0f9aa08c1a 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/config.state.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/config.state.spec.ts @@ -90,6 +90,7 @@ export const CONFIG_STATE_DATA = { tenantId: null, userName: null, email: null, + roles: [], }, features: { values: {}, From 89fc33df3a52f88ed383c3aac35220678d13c61a Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 30 Jun 2020 16:23:45 +0300 Subject: [PATCH 176/190] docs: update the part 1 of bookstore tutorial --- docs/en/Tutorials/Part-1.md | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/docs/en/Tutorials/Part-1.md b/docs/en/Tutorials/Part-1.md index a0f970c75f..f7b062aa6e 100644 --- a/docs/en/Tutorials/Part-1.md +++ b/docs/en/Tutorials/Part-1.md @@ -784,10 +784,11 @@ Open the `app-routing.module.ts` file in `src\app` folder and add a route as sho const routes: Routes = [ // ... // added a new route to the routes array -{ - path: 'books', - loadChildren: () => import('./book/book.module').then(m => m.BookModule) -}] + { + path: 'books', + loadChildren: () => import('./book/book.module').then(m => m.BookModule) + } +] ``` * We added a lazy-loaded route. See the [Lazy-Loading Feature Modules](https://angular.io/guide/lazy-loading-ngmodules#lazy-loading-feature-modules). @@ -805,13 +806,7 @@ export const APP_ROUTE_PROVIDER = [ function configureRoutes(routes: RoutesService) { return () => { routes.add([ - { - path: '/', - name: '::Menu:Home', - iconClass: 'fas fa-home', - order: 1, - layout: eLayoutType.application, - }, + //... // added below element { path: '/books', @@ -823,7 +818,6 @@ function configureRoutes(routes: RoutesService) { ]); }; } - ``` * We added a new route element to show a navigation element labeled "Books" on the menu. @@ -833,7 +827,7 @@ function configureRoutes(routes: RoutesService) { * `order` is the order of the menu item. We define 101 to show the route after the "Administration" item. * `layout` is the layout of the BooksModule's routes. `eLayoutType.application`, `eLayoutType.account` or `eLayoutType.empty` can be defined. - +For more information, see the [RoutesService document](https://docs.abp.io/en/abp/latest/UI/Angular/Modifying-the-Menu.md#via-routesservice). #### Book list component @@ -949,8 +943,9 @@ export class BookListComponent implements OnInit { } } ``` + * We imported and injected the generated `BookService`. -* We implemented the [ListService](https://docs.abp.io/en/abp/latest/UI/Angular/List-Service)` that is a utility service to provide easy pagination, sorting, and search implementation. +* We implemented the [ListService](https://docs.abp.io/en/abp/latest/UI/Angular/List-Service) that is a utility service to provide easy pagination, sorting, and search implementation. Open the `book-list.component.html` file in `app\book\book-list` folder and replace the content as below: From 13177fc0944b4bb1e7f8874f4b6b48b189ce160b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 30 Jun 2020 16:40:50 +0300 Subject: [PATCH 177/190] Update IHasExtraProperties.cs --- .../Volo/Abp/Data/IHasExtraProperties.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/IHasExtraProperties.cs b/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/IHasExtraProperties.cs index 1ba519680c..a637351e66 100644 --- a/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/IHasExtraProperties.cs +++ b/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/IHasExtraProperties.cs @@ -2,7 +2,7 @@ namespace Volo.Abp.Data { - //TODO: Move to Volo.Abp.Data.ObjectExtending namespace at v3.0 + //TODO: Move to Volo.Abp.Data.ObjectExtending namespace at 4.0? public interface IHasExtraProperties { From 58b2cae8239b6abd08a98c994d0e014a388d0c0f Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 30 Jun 2020 16:58:15 +0300 Subject: [PATCH 178/190] feat: add hasChildren method to RoutesService --- .../packages/core/src/lib/services/routes.service.ts | 5 +++++ .../packages/core/src/lib/tests/routes.service.spec.ts | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/npm/ng-packs/packages/core/src/lib/services/routes.service.ts b/npm/ng-packs/packages/core/src/lib/services/routes.service.ts index 4a3426dd51..2f80d6b44d 100644 --- a/npm/ng-packs/packages/core/src/lib/services/routes.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/routes.service.ts @@ -151,6 +151,11 @@ export abstract class AbstractNavTreeService extends Abstract return this.store.selectSnapshot(ConfigState.getGrantedPolicy(requiredPolicy)); } + hasChildren(identifier: string): boolean { + const node = this.find(item => item[this.id] === identifier); + return Boolean(node?.children?.length); + } + hasInvisibleChild(identifier: string): boolean { const node = this.find(item => item[this.id] === identifier); return node?.children?.some(child => child.invisible); diff --git a/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts index c1413d73ab..aa5e51cb17 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts @@ -68,6 +68,16 @@ describe('Routes Service', () => { }); }); + describe('#hasChildren', () => { + it('should return if node has invisible child', () => { + service.add(routes); + + expect(service.hasChildren('foo')).toBe(true); + expect(service.hasChildren('bar')).toBe(true); + expect(service.hasChildren('baz')).toBe(false); + }); + }); + describe('#hasInvisibleChild', () => { it('should return if node has invisible child', () => { service.add(routes); From e51647ae3ded2f2f105e37af164f4c73bf3c0232 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 30 Jun 2020 16:58:49 +0300 Subject: [PATCH 179/190] feat: use hasChildren to detect dropdown --- .../theme-basic/src/lib/components/routes/routes.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/routes/routes.component.ts b/npm/ng-packs/packages/theme-basic/src/lib/components/routes/routes.component.ts index 3b696b82c4..542d06e9a4 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/routes/routes.component.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/routes/routes.component.ts @@ -13,6 +13,6 @@ export class RoutesComponent { constructor(public readonly routes: RoutesService) {} isDropdown(node: TreeNode) { - return !node.isLeaf || this.routes.hasInvisibleChild(node.name); + return !node.isLeaf || this.routes.hasChildren(node.name); } } From 3c32161a596126a763cc36edeadbd751237fa201 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 30 Jun 2020 21:14:32 +0300 Subject: [PATCH 180/190] chore: remove a line from bookstore tutorial part-2 --- docs/en/Tutorials/Part-2.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index d296335cfa..0a48866956 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -456,7 +456,6 @@ In this section, you will learn how to create a new modal dialog form to create #### Add a modal to BookListComponent - Open `book-list.component.ts` file in `app\book\book-list` folder and replace the content as below: ```js From 755d6b3374568d4261d85653f27392bb0f94a3ce Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 30 Jun 2020 21:37:07 +0300 Subject: [PATCH 181/190] docs: change code blocks language --- docs/en/UI/Angular/Migration-Guide-v3.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/en/UI/Angular/Migration-Guide-v3.md b/docs/en/UI/Angular/Migration-Guide-v3.md index f241469193..8c1a16c942 100644 --- a/docs/en/UI/Angular/Migration-Guide-v3.md +++ b/docs/en/UI/Angular/Migration-Guide-v3.md @@ -37,7 +37,7 @@ yarn ng update @angular/cli @angular/core ng-zorro-antd --force In ABP v2.x, every lazy loaded module had a config module available via a separate package and module configuration was as follows: -```ts +```js import { AccountConfigModule } from '@abp/ng.account.config'; @NgModule({ @@ -52,7 +52,7 @@ export class AppModule {} ...and in app-routing.module.ts... -```ts +```js const routes: Routes = [ // other route configuration { @@ -72,7 +72,7 @@ Although working, this had a few disadvantages: In ABP v3.0, we have introduced a secondary entry points for each config module as well as a new way to configure lazy loaded modules without the wrappers. Now, the module configuration looks like this: -```ts +```js import { AccountConfigModule } from '@abp/ng.account/config'; @NgModule({ @@ -87,7 +87,7 @@ export class AppModule {} ...and in app-routing.module.ts... -```ts +```js const routes: Routes = [ // other route configuration { @@ -104,7 +104,7 @@ This change helped us reduce bundle size and build times substantially. We belie AppModule: -```ts +```js import { AccountConfigModule } from '@abp/ng.account/config'; import { CoreModule } from '@abp/ng.core'; import { IdentityConfigModule } from '@abp/ng.identity/config'; @@ -144,7 +144,7 @@ export class AppModule {} AppRoutingModule: -```ts +```js import { DynamicLayoutComponent } from '@abp/ng.core'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -261,7 +261,7 @@ Since `abp-table` is not dropped yet, modules previously built by ABP v2.x will The usage of those directives is rather simple: -```ts +```js @Component({ providers: [ListService], }) From f025b64936dafadbe55974c1861209873028c509 Mon Sep 17 00:00:00 2001 From: Galip Tolga Erdem Date: Tue, 30 Jun 2020 23:56:41 +0300 Subject: [PATCH 182/190] Added OrganizationUnit Management documentation --- docs/en/Modules/Index.md | 2 +- .../en/Modules/OrganizationUnit-Management.md | 125 ++++++++++++++++++ 2 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 docs/en/Modules/OrganizationUnit-Management.md diff --git a/docs/en/Modules/Index.md b/docs/en/Modules/Index.md index 71bf58333c..82464cd580 100644 --- a/docs/en/Modules/Index.md +++ b/docs/en/Modules/Index.md @@ -17,7 +17,7 @@ There are some **free and open source** application modules developed and mainta * **Blogging**: Used to create fancy blogs. ABP's [own blog](https://blog.abp.io/) already using this module. * [**Docs**](Docs.md): Used to create technical documentation pages. ABP's [own documentation](https://docs.abp.io) already using this module. * **Feature Management**: Used to persist and manage the [features](../Features.md). -* **Identity**: Manages roles, users and their permissions, based on the Microsoft Identity library. +* **Identity**: Manages [organization units](OrganizationUnit-Management.md), roles, users and their permissions, based on the Microsoft Identity library. * **IdentityServer**: Integrates to IdentityServer4. * **Permission Management**: Used to persist permissions. * **[Setting Management](Setting-Management.md)**: Used to persist and manage the [settings](../Settings.md). diff --git a/docs/en/Modules/OrganizationUnit-Management.md b/docs/en/Modules/OrganizationUnit-Management.md new file mode 100644 index 0000000000..5befdb9349 --- /dev/null +++ b/docs/en/Modules/OrganizationUnit-Management.md @@ -0,0 +1,125 @@ +# Organization Unit Management + +Organization units (OU) is a part of **Identity Module** and can be used to **hierarchically group users and entities**. + +### OrganizationUnit Entity + +An OU is represented by the **OrganizationUnit** entity. The fundamental properties of this entity are: + +- **TenantId**: Tenant's Id of this OU. Can be null for host OUs. +- **ParentId**: Parent OU's Id. Can be null if this is a root OU. +- **Code**: A hierarchical string code that is unique for a tenant. +- **DisplayName**: Shown name of the OU. + +The OrganizationUnit entity's primary key (Id) is a **Guid** type and it derives from the [**FullAuditedAggregateRoot**](../Entities##aggregateroot-class) class which provides audit information with **IsDeleted** property (OUs are not deleted from the database, they are just marked as deleted). + +#### Organization Tree + +Since an OU can have a parent, all OUs of a tenant are in a **tree** structure. There are some rules for this tree; + +- There can be more than one root (where the ParentId is null). +- Maximum depth of the tree is defined as a constant as OrganizationUnit.**MaxDepth**. The value is **16**. +- There is a limit for the first-level children count of an OU (because of the fixed OU Code unit length explained below). + +#### OU Code + +OU code is automatically generated and maintained by the OrganizationUnit Manager. It's a string that looks something like this: + +"**00001.00042.00005**" + +This code can be used to easily query the database for all the children of an OU (recursively). There are some rules for this code: + +- It must be **unique** for a [tenant](../Multi-Tenancy.md). +- All the children of the same OU have codes that **start with the parent OU's code**. +- It's **fixed length** and based on the level of the OU in the tree, as shown in the sample. +- While the OU code is unique, it can be **changeable** if you move an OU. +- We must reference an OU by Id, not Code. + +### OrganizationUnit Manager + +The **OrganizationUnitManager** class can be [injected](../Dependency-Injection.md) and used to manage OUs. Common use cases are: + +- Create, Update or Delete an OU +- Move an OU in the OU tree. +- Getting information about the OU tree and its items. + +#### Multi-Tenancy + +The OrganizationUnitManager is designed to work for a **single tenant** at a time. It works for the **current tenant** by default. + +### Common Use Cases + +There are some common use cases for OUs. You can find the source code of the samples [here](https://github.com/abpframework/abp-samples/tree/master/OrganizationUnitSample). + +#### Creating An Entity That Belongs To An Organization Unit + +The most obvious usage of OUs is to assign an entity to an OU. Sample entity: + +```csharp +public class Product : AuditedAggregateRoot, IMultiTenant +{ + public virtual Guid OrganizationUnitId { get; private set; } + public virtual Guid? TenantId { get; } + public virtual string Name { get; private set; } + public virtual float Price { get; private set; } +} +``` + +You need to create **OrganizationUnitId** property to assign this entity to an OU. Depending on requirement, this property can be nullable. You can now relate a Product to an OU and query the products of a specific OU. + +You can use **IMultiTenant** interface if you want to distinguish products of different tenants in a multi-tenant application (see the [Multi-Tenancy document](https://aspnetboilerplate.com/Pages/Documents/Multi-Tenancy#data-filters) for more info). If your application is not multi-tenant, you don't need this interface and property. + +#### Getting Entities In An Organization Unit + +To get the Products of an OU, you can implement a simple domain service; [Product Manager](https://github.com/abpframework/abp-samples/blob/master/OrganizationUnitSample/src/OrganizationUnitSample.Domain/Products/ProductManager.cs) in this case to get the filtered data: + +```csharp +public class ProductManager : IDomainService +{ + private readonly IProductRepository _productRepository; + + public ProductManager(IProductRepository productRepository) + { + _productRepository = productRepository; + } + + public List GetProductsInOu(OrganizationUnit organizationUnit) + { + return (await _productRepository.GetListAsync()).Where(q => q.OrganizationUnitId == organizationUnit.Id).ToList(); + } +} +``` + +**For better practice**, you should consider querying it on domain layer for performance and scalability. To do so, add a method to your repository interface: + +```csharp +public interface IProductRepository : IRepository +{ + public Task> GetProductsOfOrganizationUnitAsync(Guid organizationUnitId); +} +``` + +Then implement it on your ORM layer (which is EntityFrameworkCore in this [sample](https://github.com/abpframework/abp-samples/blob/master/OrganizationUnitSample/src/OrganizationUnitSample.EntityFrameworkCore/Products/ProductRepository.cs)): + +```csharp +public Task> GetProductsOfOrganizationUnitAsync(Guid organizationUnitId) +{ + return DbSet.Where(p => p.OrganizationUnitId == organizationUnitId).ToListAsync(); +} +``` + +Afterwards, you can modify your domain service like below: + +```csharp +public List GetProductsInOu(OrganizationUnit organizationUnit) +{ + return await _productRepository.GetProductsOfOrganizationUnitAsync(organizationUnit.Id); +} +``` + +### Settings + +You can find **MaxUserMembershipCount** settings under SettingManagement: + +- **MaxUserMembershipCount**: Maximum allowed membership count for a user. + Default value is **int.MaxValue** which allows a user to be a member of unlimited OUs at the same time. \ No newline at end of file From e911519489721d501c32d2bb9f7f240c72f8f05f Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 30 Jun 2020 23:58:53 +0300 Subject: [PATCH 183/190] style: move ngx-datatable bordered class style to theme-basic styles --- .../packages/theme-basic/src/lib/constants/styles.ts | 4 ++++ .../packages/theme-shared/src/lib/constants/styles.ts | 5 ----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/npm/ng-packs/packages/theme-basic/src/lib/constants/styles.ts b/npm/ng-packs/packages/theme-basic/src/lib/constants/styles.ts index 2de9931873..03fae58229 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/constants/styles.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/constants/styles.ts @@ -134,4 +134,8 @@ background-color: rgba(0, 0, 0, 0.6); background-color: #f4f4f4; border: 1px solid #c8c8c8; } +.bordered .datatable-body-row { + border-top: 1px solid #eee; + margin-top: -1px; +} `; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/constants/styles.ts b/npm/ng-packs/packages/theme-shared/src/lib/constants/styles.ts index f997eb6e5c..a3698f2164 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/constants/styles.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/constants/styles.ts @@ -45,11 +45,6 @@ export default ` background: #8a8686; } -.bordered .datatable-body-row { - border-top: 1px solid #eee; - margin-top: -1px; -} - .abp-ellipsis-inline { display: inline-block; overflow: hidden; From 407d5d43f124c738ccaed1026ccbce7292ad34b5 Mon Sep 17 00:00:00 2001 From: Galip Tolga Erdem Date: Wed, 1 Jul 2020 00:27:05 +0300 Subject: [PATCH 184/190] Update OrganizationUnit-Management.md fixed link to entites --- docs/en/Modules/OrganizationUnit-Management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Modules/OrganizationUnit-Management.md b/docs/en/Modules/OrganizationUnit-Management.md index 5befdb9349..94caa8bb6f 100644 --- a/docs/en/Modules/OrganizationUnit-Management.md +++ b/docs/en/Modules/OrganizationUnit-Management.md @@ -11,7 +11,7 @@ An OU is represented by the **OrganizationUnit** entity. The fundamental propert - **Code**: A hierarchical string code that is unique for a tenant. - **DisplayName**: Shown name of the OU. -The OrganizationUnit entity's primary key (Id) is a **Guid** type and it derives from the [**FullAuditedAggregateRoot**](../Entities##aggregateroot-class) class which provides audit information with **IsDeleted** property (OUs are not deleted from the database, they are just marked as deleted). +The OrganizationUnit entity's primary key (Id) is a **Guid** type and it derives from the [**FullAuditedAggregateRoot**](../Entities.md#aggregateroot-class) class which provides audit information with **IsDeleted** property (OUs are not deleted from the database, they are just marked as deleted). #### Organization Tree From 0eddd78c085452f978f9023d1a768fa91a54a525 Mon Sep 17 00:00:00 2001 From: Galip Tolga Erdem Date: Wed, 1 Jul 2020 00:41:15 +0300 Subject: [PATCH 185/190] Update OrganizationUnit-Management.md --- docs/en/Modules/OrganizationUnit-Management.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/en/Modules/OrganizationUnit-Management.md b/docs/en/Modules/OrganizationUnit-Management.md index 94caa8bb6f..d56c5ba6ea 100644 --- a/docs/en/Modules/OrganizationUnit-Management.md +++ b/docs/en/Modules/OrganizationUnit-Management.md @@ -18,7 +18,6 @@ The OrganizationUnit entity's primary key (Id) is a **Guid** type and it derives Since an OU can have a parent, all OUs of a tenant are in a **tree** structure. There are some rules for this tree; - There can be more than one root (where the ParentId is null). -- Maximum depth of the tree is defined as a constant as OrganizationUnit.**MaxDepth**. The value is **16**. - There is a limit for the first-level children count of an OU (because of the fixed OU Code unit length explained below). #### OU Code @@ -33,7 +32,7 @@ This code can be used to easily query the database for all the children of an OU - All the children of the same OU have codes that **start with the parent OU's code**. - It's **fixed length** and based on the level of the OU in the tree, as shown in the sample. - While the OU code is unique, it can be **changeable** if you move an OU. -- We must reference an OU by Id, not Code. +- You must reference an OU by Id, not Code. ### OrganizationUnit Manager From 0fc0abd20d4fad4a716b722cf704d0e05aa5438a Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 1 Jul 2020 11:35:14 +0800 Subject: [PATCH 186/190] Update document --- docs/en/UI/Angular/List-Service.md | 2 +- .../AspNetCore/Tag-Helpers/Dynamic-Forms.md | 290 +++++---- docs/zh-Hans/CLI.md | 3 +- docs/zh-Hans/Entity-Framework-Core-MySQL.md | 4 +- .../Entity-Framework-Core-Oracle-Devart.md | 60 ++ .../Entity-Framework-Core-Oracle-Official.md | 67 ++ docs/zh-Hans/Entity-Framework-Core-Oracle.md | 67 +- .../Entity-Framework-Core-PostgreSQL.md | 4 +- docs/zh-Hans/Entity-Framework-Core-SQLite.md | 4 +- docs/zh-Hans/Tutorials/Part-1.md | 224 +++---- docs/zh-Hans/Tutorials/Part-2.md | 596 ++++++------------ .../images/bookstore-actions-buttons.png | Bin 29435 -> 25169 bytes .../images/bookstore-angular-file-tree.png | Bin 58541 -> 50047 bytes .../Tutorials/images/bookstore-book-list.png | Bin 49861 -> 56461 bytes .../images/bookstore-confirmation-popup.png | Bin 13523 -> 23065 bytes .../images/bookstore-empty-new-book-modal.png | Bin 104068 -> 56983 bytes docs/zh-Hans/UI/Angular/List-Service.md | 89 +-- docs/zh-Hans/UI/Angular/Migration-Guide-v3.md | 363 +++++++++++ docs/zh-Hans/UI/Angular/Modifying-the-Menu.md | 220 ++++--- .../images/table-of-packages-to-update.png | Bin 0 -> 155495 bytes .../AspNetCore/Tag-Helpers/Dynamic-Forms.md | 278 +++++++- docs/zh-Hans/Unit-Of-Work.md | 2 +- docs/zh-Hans/Virtual-File-System.md | 172 ++--- docs/zh-Hans/docs-nav.json | 4 + 24 files changed, 1473 insertions(+), 976 deletions(-) create mode 100644 docs/zh-Hans/Entity-Framework-Core-Oracle-Devart.md create mode 100644 docs/zh-Hans/Entity-Framework-Core-Oracle-Official.md create mode 100644 docs/zh-Hans/UI/Angular/Migration-Guide-v3.md create mode 100644 docs/zh-Hans/UI/Angular/images/table-of-packages-to-update.png diff --git a/docs/en/UI/Angular/List-Service.md b/docs/en/UI/Angular/List-Service.md index 900606d725..f65f0db4cd 100644 --- a/docs/en/UI/Angular/List-Service.md +++ b/docs/en/UI/Angular/List-Service.md @@ -120,7 +120,7 @@ You may use observables in combination with [AsyncPipe](https://angular.io/guide ``` -> We donot recommend using NGXS store for CRUD pages, unless your application needs to share list information between components or use it later on in another page. +> We do not recommend using NGXS store for CRUD pages, unless your application needs to share list information between components or use it later on in another page. ## How to Refresh Table on Create/Update/Delete diff --git a/docs/en/UI/AspNetCore/Tag-Helpers/Dynamic-Forms.md b/docs/en/UI/AspNetCore/Tag-Helpers/Dynamic-Forms.md index 5b4b766a27..3992c7d8a1 100644 --- a/docs/en/UI/AspNetCore/Tag-Helpers/Dynamic-Forms.md +++ b/docs/en/UI/AspNetCore/Tag-Helpers/Dynamic-Forms.md @@ -11,92 +11,95 @@ Basic usage: ````xml ```` + Model: + ````csharp public class DynamicFormsModel : PageModel - { - [BindProperty] - public DetailedModel MyDetailedModel { get; set; } +{ + [BindProperty] + public DetailedModel MyDetailedModel { get; set; } - public List CountryList { get; set; } = new List - { - new SelectListItem { Value = "CA", Text = "Canada"}, - new SelectListItem { Value = "US", Text = "USA"}, - new SelectListItem { Value = "UK", Text = "United Kingdom"}, - new SelectListItem { Value = "RU", Text = "Russia"} - }; + public List CountryList { get; set; } = new List + { + new SelectListItem { Value = "CA", Text = "Canada"}, + new SelectListItem { Value = "US", Text = "USA"}, + new SelectListItem { Value = "UK", Text = "United Kingdom"}, + new SelectListItem { Value = "RU", Text = "Russia"} + }; - public void OnGet() - { - MyDetailedModel = new DetailedModel - { - Name = "", - Description = "Lorem ipsum dolor sit amet.", - IsActive = true, - Age = 65, - Day = DateTime.Now, - MyCarType = CarType.Coupe, - YourCarType = CarType.Sedan, - Country = "RU", - NeighborCountries = new List() { "UK", "CA" } - }; - } + public void OnGet() + { + MyDetailedModel = new DetailedModel + { + Name = "", + Description = "Lorem ipsum dolor sit amet.", + IsActive = true, + Age = 65, + Day = DateTime.Now, + MyCarType = CarType.Coupe, + YourCarType = CarType.Sedan, + Country = "RU", + NeighborCountries = new List() { "UK", "CA" } + }; + } - public class DetailedModel - { - [Required] - [Placeholder("Enter your name...")] - [Display(Name = "Name")] - public string Name { get; set; } - - [TextArea(Rows = 4)] - [Display(Name = "Description")] - [InputInfoText("Describe Yourself")] - public string Description { get; set; } - - [Required] - [DataType(DataType.Password)] - [Display(Name = "Password")] - public string Password { get; set; } - - [Display(Name = "Is Active")] - public bool IsActive { get; set; } - - [Required] - [Display(Name = "Age")] - public int Age { get; set; } - - [Required] - [Display(Name = "My Car Type")] - public CarType MyCarType { get; set; } - - [Required] - [AbpRadioButton(Inline = true)] - [Display(Name = "Your Car Type")] - public CarType YourCarType { get; set; } - - [DataType(DataType.Date)] - [Display(Name = "Day")] - public DateTime Day { get; set; } - - [SelectItems(nameof(CountryList))] - [Display(Name = "Country")] - public string Country { get; set; } - - [SelectItems(nameof(CountryList))] - [Display(Name = "Neighbor Countries")] - public List NeighborCountries { get; set; } - } + public class DetailedModel + { + [Required] + [Placeholder("Enter your name...")] + [Display(Name = "Name")] + public string Name { get; set; } + + [TextArea(Rows = 4)] + [Display(Name = "Description")] + [InputInfoText("Describe Yourself")] + public string Description { get; set; } + + [Required] + [DataType(DataType.Password)] + [Display(Name = "Password")] + public string Password { get; set; } + + [Display(Name = "Is Active")] + public bool IsActive { get; set; } + + [Required] + [Display(Name = "Age")] + public int Age { get; set; } + + [Required] + [Display(Name = "My Car Type")] + public CarType MyCarType { get; set; } + + [Required] + [AbpRadioButton(Inline = true)] + [Display(Name = "Your Car Type")] + public CarType YourCarType { get; set; } + + [DataType(DataType.Date)] + [Display(Name = "Day")] + public DateTime Day { get; set; } + + [SelectItems(nameof(CountryList))] + [Display(Name = "Country")] + public string Country { get; set; } + + [SelectItems(nameof(CountryList))] + [Display(Name = "Neighbor Countries")] + public List NeighborCountries { get; set; } + } - public enum CarType - { - Sedan, - Hatchback, - StationWagon, - Coupe - } + public enum CarType + { + Sedan, + Hatchback, + StationWagon, + Coupe } +} ```` + ## Demo See the [dynamic forms demo page](https://bootstrap-taghelpers.abp.io/Components/DynamicForms) to see it in action. @@ -125,7 +128,7 @@ Default value is `True`. ## Form Content Placement -By default, `abp-dynamicform` clears the inner html and places the inputs into itself. If you want to add additional content to dynamic form or place the inputs to some specific area, you can use ` ` tag. This tag will be replaced by form content and rest of the inner html of `abp-dynamic-form` tag will be unchanged. +By default, `abp-dynamic-form` clears the inner html and places the inputs into itself. If you want to add additional content to dynamic form or place the inputs to some specific area, you can use ` ` tag. This tag will be replaced by form content and rest of the inner html of `abp-dynamic-form` tag will be unchanged. Usage: @@ -152,23 +155,23 @@ Default `DisplayOrder` attribute number is 10000 for every property. See example below: ````csharp - public class OrderExampleModel - { - [DisplayOrder(10004)] - public string Name{ get; set; } - - [DisplayOrder(10005)] - public string Surname{ get; set; } - - //Default 10000 - public string EmailAddress { get; set; } - - [DisplayOrder(10003)] - public string PhoneNumber { get; set; } - - [DisplayOrder(9999)] - public string City { get; set; } - } +public class OrderExampleModel +{ + [DisplayOrder(10004)] + public string Name{ get; set; } + + [DisplayOrder(10005)] + public string Surname{ get; set; } + + //Default 10000 + public string EmailAddress { get; set; } + + [DisplayOrder(10003)] + public string PhoneNumber { get; set; } + + [DisplayOrder(9999)] + public string City { get; set; } +} ```` In this example, input fields will be displayed with this order: `City` > `EmailAddress` > `PhoneNumber` > `Name` > `Surname`. @@ -198,55 +201,57 @@ If you have read the [Form elements document](Form-elements.md), you noticed tha ````xml ```` + Model: + ````csharp public class DynamicFormsModel : PageModel - { - [BindProperty] - public DetailedModel MyDetailedModel { get; set; } +{ + [BindProperty] + public DetailedModel MyDetailedModel { get; set; } - public List CountryList { get; set; } = new List - { - new SelectListItem { Value = "CA", Text = "Canada"}, - new SelectListItem { Value = "US", Text = "USA"}, - new SelectListItem { Value = "UK", Text = "United Kingdom"}, - new SelectListItem { Value = "RU", Text = "Russia"} - }; + public List CountryList { get; set; } = new List + { + new SelectListItem { Value = "CA", Text = "Canada"}, + new SelectListItem { Value = "US", Text = "USA"}, + new SelectListItem { Value = "UK", Text = "United Kingdom"}, + new SelectListItem { Value = "RU", Text = "Russia"} + }; - public void OnGet() - { - MyDetailedModel = new DetailedModel - { - ComboCarType = CarType.Coupe, - RadioCarType = CarType.Sedan, - ComboCountry = "RU", - RadioCountry = "UK" - }; - } + public void OnGet() + { + MyDetailedModel = new DetailedModel + { + ComboCarType = CarType.Coupe, + RadioCarType = CarType.Sedan, + ComboCountry = "RU", + RadioCountry = "UK" + }; + } - public class DetailedModel - { - public CarType ComboCarType { get; set; } - - [AbpRadioButton(Inline = true)] - public CarType RadioCarType { get; set; } - - [SelectItems(nameof(CountryList))] - public string ComboCountry { get; set; } - - [AbpRadioButton()] - [SelectItems(nameof(CountryList))] - public string RadioCountry { get; set; } - } + public class DetailedModel + { + public CarType ComboCarType { get; set; } + + [AbpRadioButton(Inline = true)] + public CarType RadioCarType { get; set; } + + [SelectItems(nameof(CountryList))] + public string ComboCountry { get; set; } + + [AbpRadioButton()] + [SelectItems(nameof(CountryList))] + public string RadioCountry { get; set; } + } - public enum CarType - { - Sedan, - Hatchback, - StationWagon, - Coupe - } + public enum CarType + { + Sedan, + Hatchback, + StationWagon, + Coupe } +} ```` As you see in example above: @@ -265,13 +270,6 @@ By default, it will try to find "DisplayName:{PropertyName}" or "{PropertyName}" You can set it yourself by using `[Display()]` attribute of Asp.Net Core. You can use a localization key in this attribute. See example below: ````csharp - [Display(Name = "Name")] - public string Name { get; set; } -```` - - - - - - - +[Display(Name = "Name")] +public string Name { get; set; } +```` \ No newline at end of file diff --git a/docs/zh-Hans/CLI.md b/docs/zh-Hans/CLI.md index 788c4a67ed..e733b6e2e5 100644 --- a/docs/zh-Hans/CLI.md +++ b/docs/zh-Hans/CLI.md @@ -169,7 +169,8 @@ abp update [options] * `--nuget`: 仅更新的NuGet包 * `--solution-path` 或 `-sp`: 指定解决方案路径/目录. 默认使用当前目录 * `--solution-name` 或 `-sn`: 指定解决方案名称. 默认在目录中搜索`*.sln`文件. - +*`--check-all`: 分别检查每个包的新版本. 默认是 `false`. + ### 切换到每晚构建(预览)包 想要切换到ABP框架的最新预览版可以使用此命令. diff --git a/docs/zh-Hans/Entity-Framework-Core-MySQL.md b/docs/zh-Hans/Entity-Framework-Core-MySQL.md index 48297ea68d..75505b883d 100644 --- a/docs/zh-Hans/Entity-Framework-Core-MySQL.md +++ b/docs/zh-Hans/Entity-Framework-Core-MySQL.md @@ -8,14 +8,14 @@ ## 替换模块依赖项 -在 `.EntityFrameworkCore` 项目中找到 **YourProjectName*EntityFrameworkCoreModule** 类, 删除 `DependsOn` attribute 上的`typeof(AbpEntityFrameworkCoreSqlServerModule)`, 添加 `typeof(AbpEntityFrameworkCoreMySQLModule)` (或者替换 `using Volo.Abp.EntityFrameworkCore.SqlServer;` 为 `using Volo.Abp.EntityFrameworkCore.MySQL;`). +在 `.EntityFrameworkCore` 项目中找到 **YourProjectName*EntityFrameworkCoreModule** 类, 删除 `DependsOn` attribute 上的`typeof(AbpEntityFrameworkCoreSqlServerModule)`, 添加 `typeof(AbpEntityFrameworkCoreMySQLModule)` (并且替换 `using Volo.Abp.EntityFrameworkCore.SqlServer;` 为 `using Volo.Abp.EntityFrameworkCore.MySQL;`). ## UseMySQL() 查找你的解决方案中 `UseSqlServer()`调用,替换为 `UseMySQL()`. 检查下列文件: * `.EntityFrameworkCore` 项目中的*YourProjectName*EntityFrameworkCoreModule.cs. -* `.EntityFrameworkCore` 项目中的*YourProjectName*MigrationsDbContextFactory.cs. +* `.EntityFrameworkCore.DbMigrations` 项目中的*YourProjectName*MigrationsDbContextFactory.cs. > 根据你的解决方案的结构,你可能发现更多需要改变代码的文件. diff --git a/docs/zh-Hans/Entity-Framework-Core-Oracle-Devart.md b/docs/zh-Hans/Entity-Framework-Core-Oracle-Devart.md new file mode 100644 index 0000000000..150ee51f11 --- /dev/null +++ b/docs/zh-Hans/Entity-Framework-Core-Oracle-Devart.md @@ -0,0 +1,60 @@ +# 切换到 EF Core Oracle Devart 提供程序 + +本文介绍如何将预配置为SqlServer提供程序的 **[应用程序启动模板](Startup-Templates/Application.md)** 切换到 **Oracle** 数据库提供程序 + +> 本文档使用[Devart](https://www.devart.com/dotconnect/oracle/)公司的付费库,有关其他选项,请参见[文档](Entity-Framework-Core-Oracle.md). + +## 替换Volo.Abp.EntityFrameworkCore.SqlServer包 + +解决方案中的 `.EntityFrameworkCore` 项目依赖于 [Volo.Abp.EntityFrameworkCore.SqlServer](https://www.nuget.org/packages/Volo.Abp.EntityFrameworkCore.SqlServer) NuGet包. 删除这个包并且添加相同版本的[Volo.Abp.EntityFrameworkCore.Oracle.Devart](https://www.nuget.org/packages/Volo.Abp.EntityFrameworkCore.Oracle.Devart) 包. + +## 替换模块依赖项 + +在 `.EntityFrameworkCore` 项目中找到 **YourProjectName*EntityFrameworkCoreModule** 类, 删除 `DependsOn` attribute 上的`typeof(AbpEntityFrameworkCoreSqlServerModule)`, 添加 `typeof(AbpEntityFrameworkCoreOracleDevartModule)` (并且替换 `using Volo.Abp.EntityFrameworkCore.SqlServer;` 为 `using Volo.Abp.EntityFrameworkCore.Oracle.Devart;`). + +## UseOracle() + +查找你的解决方案中 `UseSqlServer()`调用,替换为 `UseOracle()`. 检查下列文件: + +* `.EntityFrameworkCore` 项目中的*YourProjectName*EntityFrameworkCoreModule.cs. +* `.EntityFrameworkCore.DbMigrations` 项目中的*YourProjectName*MigrationsDbContextFactory.cs. + +找到 *YourProjectName*MigrationsDbContextFactory.cs 的 `CreateDbContext()` 方法,将以下代码块 + +```csharp +var builder = new DbContextOptionsBuilder() + .UseSqlServer(configuration.GetConnectionString("Default")); +``` + +替换为: + +```csharp +var builder = (DbContextOptionsBuilder) + new DbContextOptionsBuilder().UseOracle + ( + configuration.GetConnectionString("Default") + ); +``` + +> 根据你的解决方案的结构,你可能发现更多需要改变代码的文件. + +## 更改连接字符串 + +Oracle连接字符串与SQL Server连接字符串不同. 所以检查你的解决方案中所有的 `appsettings.json` 文件,更改其中的连接字符串. 有关Oracle连接字符串选项的详细内容请参见[connectionstrings.com](https://www.connectionstrings.com/oracle/). + +通常需要更改 `.DbMigrator` 和 `.Web` 项目里面的 `appsettings.json` ,但它取决于你的解决方案结构. + +## 重新生成迁移 + +启动模板使用[Entity Framework Core的Code First迁移](https://docs.microsoft.com/zh-cn/ef/core/managing-schemas/migrations/). EF Core迁移取决于所选的DBMS提供程序. 因此更改DBMS提供程序会导致迁移失败. + +* 删除 `.EntityFrameworkCore.DbMigrations` 项目下的Migrations文件夹,并重新生成解决方案. +* 在包管理控制台中运行 `Add-Migration "Initial"`(在解决方案资源管理器选择 `.DbMigrator` (或 `.Web`) 做为启动项目并且选择 `.EntityFrameworkCore.DbMigrations` 做为默认项目). + +这将创建一个配置所有数据库对象(表)的数据库迁移. + +运行 `.DbMigrator` 项目创建数据库和初始种子数据. + +## 运行应用程序 + +它已准备就绪, 只需要运行该应用程序与享受编码. diff --git a/docs/zh-Hans/Entity-Framework-Core-Oracle-Official.md b/docs/zh-Hans/Entity-Framework-Core-Oracle-Official.md new file mode 100644 index 0000000000..e5932be3db --- /dev/null +++ b/docs/zh-Hans/Entity-Framework-Core-Oracle-Official.md @@ -0,0 +1,67 @@ +# 切换到EF Core Oracle提供程序 + +本文介绍如何将预配置为SqlServer提供程序的 **[应用程序启动模板](Startup-Templates/Application.md)** 切换到 **Oracle** 数据库提供程序 + +> 本文档使用[Devart](https://www.devart.com/dotconnect/oracle/)公司的付费库,因为它是oracle唯一支持EF Core 3.x的库 + +## 替换Volo.Abp.EntityFrameworkCore.SqlServer包 + +解决方案中的 `.EntityFrameworkCore` 项目依赖于 [Volo.Abp.EntityFrameworkCore.SqlServer](https://www.nuget.org/packages/Volo.Abp.EntityFrameworkCore.SqlServer) NuGet包. 删除这个包并且添加相同版本的 [Volo.Abp.EntityFrameworkCore.Oracle.Devart](https://www.nuget.org/packages/Volo.Abp.EntityFrameworkCore.Oracle.Devart) 包. + +## 替换模块依赖项 + +在 `.EntityFrameworkCore` 项目中找到 **YourProjectName*EntityFrameworkCoreModule** 类, 删除 `DependsOn` attribute 上的`typeof(AbpEntityFrameworkCoreSqlServerModule)`, 添加 `typeof(AbpEntityFrameworkCoreOracleDevartModule)` (并且替换 `using Volo.Abp.EntityFrameworkCore.SqlServer;` 为 `using Volo.Abp.EntityFrameworkCore.Oracle.Devart;`). + +## UseOracle() + +Find `UseSqlServer()` calls in your solution, replace with `UseOracle()`. Check the following files: + +* *YourProjectName*EntityFrameworkCoreModule.cs inside the `.EntityFrameworkCore` project. +* *YourProjectName*MigrationsDbContextFactory.cs inside the `.EntityFrameworkCore.DbMigrations` project. + +In the `CreateDbContext()` method of the *YourProjectName*MigrationsDbContextFactory.cs, replace the following code block + +查找你的解决方案中 `UseSqlServer()`调用,替换为 `UseOracle()`. 检查下列文件: + +* `.EntityFrameworkCore` 项目中的*YourProjectName*EntityFrameworkCoreModule.cs. +* `.EntityFrameworkCore.DbMigrations` 项目中的*YourProjectName*MigrationsDbContextFactory.cs. + +使用以下代码替换*YourProjectName*MigrationsDbContextFactory.cs中的 `CreateDbContext()` 方法: + +```csharp +var builder = new DbContextOptionsBuilder() + .UseSqlServer(configuration.GetConnectionString("Default")); +``` + +与这个 + +```csharp +var builder = (DbContextOptionsBuilder) + new DbContextOptionsBuilder().UseOracle + ( + configuration.GetConnectionString("Default") + ); +``` + +> 根据你的解决方案的结构,你可能发现更多需要改变代码的文件. + +## 更改连接字符串 + +Oracle连接字符串与SQL Server连接字符串不同. 所以检查你的解决方案中所有的 `appsettings.json` 文件,更改其中的连接字符串. 有关oracle连接字符串选项的详细内容请参见[connectionstrings.com](https://www.connectionstrings.com/oracle/). + +通常需要更改 `.DbMigrator` 和 `.Web` 项目里面的 `appsettings.json` ,但它取决于你的解决方案结构. + +## 重新生成迁移 + +启动模板使用[Entity Framework Core的Code First迁移](https://docs.microsoft.com/zh-cn/ef/core/managing-schemas/migrations/). EF Core迁移取决于所选的DBMS提供程序. 因此更改DBMS提供程序会导致迁移失败. + +* 删除 `.EntityFrameworkCore.DbMigrations` 项目下的Migrations文件夹,并重新生成解决方案. +* 在包管理控制台中运行 `Add-Migration "Initial"`(在解决方案资源管理器选择 `.DbMigrator` (或 `.Web`) 做为启动项目并且选择 `.EntityFrameworkCore.DbMigrations` 做为默认项目). + +这将创建一个配置所有数据库对象(表)的数据库迁移. + +运行 `.DbMigrator` 项目创建数据库和初始种子数据. + +## 运行应用程序 + +它已准备就绪, 只需要运行该应用程序与享受编码. \ No newline at end of file diff --git a/docs/zh-Hans/Entity-Framework-Core-Oracle.md b/docs/zh-Hans/Entity-Framework-Core-Oracle.md index ee510e5edc..cedd4345de 100644 --- a/docs/zh-Hans/Entity-Framework-Core-Oracle.md +++ b/docs/zh-Hans/Entity-Framework-Core-Oracle.md @@ -1,67 +1,10 @@ -# 切换到EF Core Oracle提供程序 +# 切换到EF Core Oracle 提供程序 本文介绍如何将预配置为SqlServer提供程序的 **[应用程序启动模板](Startup-Templates/Application.md)** 切换到 **Oracle** 数据库提供程序 -> 本文档使用[Devart](https://www.devart.com/dotconnect/oracle/)公司的付费库,因为它是oracle唯一支持EF Core 3.x的库 +ABP框架提供了两种不同的Oracle包集成. 你可以选择以下其中一个: -## 替换Volo.Abp.EntityFrameworkCore.SqlServer包 +* **[Volo.Abp.EntityFrameworkCore.Oracle](Entity-Framework-Core-Oracle-Official.md)** 使用官方 & 免费的oracle驱动 ( **当前处于 beta**). +* **[Volo.Abp.EntityFrameworkCore.Oracle.Devart](Entity-Framework-Core-Oracle-Devart.md)** 使用[Devart](https://www.devart.com/)公司提供的商业(付费)驱动. -解决方案中的 `.EntityFrameworkCore` 项目依赖于 [Volo.Abp.EntityFrameworkCore.SqlServer](https://www.nuget.org/packages/Volo.Abp.EntityFrameworkCore.SqlServer) NuGet包. 删除这个包并且添加相同版本的 [Volo.Abp.EntityFrameworkCore.Oracle.Devart](https://www.nuget.org/packages/Volo.Abp.EntityFrameworkCore.Oracle.Devart) 包. - -## 替换模块依赖项 - -在 `.EntityFrameworkCore` 项目中找到 **YourProjectName*EntityFrameworkCoreModule** 类, 删除 `DependsOn` attribute 上的`typeof(AbpEntityFrameworkCoreSqlServerModule)`, 添加 `typeof(AbpEntityFrameworkCoreOracleDevartModule)` (或者替换 `using Volo.Abp.EntityFrameworkCore.SqlServer;` 为 `using Volo.Abp.EntityFrameworkCore.Oracle.Devart;`). - -## UseOracle() - -Find `UseSqlServer()` calls in your solution, replace with `UseOracle()`. Check the following files: - -* *YourProjectName*EntityFrameworkCoreModule.cs inside the `.EntityFrameworkCore` project. -* *YourProjectName*MigrationsDbContextFactory.cs inside the `.EntityFrameworkCore.DbMigrations` project. - -In the `CreateDbContext()` method of the *YourProjectName*MigrationsDbContextFactory.cs, replace the following code block - -查找你的解决方案中 `UseSqlServer()`调用,替换为 `UseOracle()`. 检查下列文件: - -* `.EntityFrameworkCore` 项目中的*YourProjectName*EntityFrameworkCoreModule.cs. -* `.EntityFrameworkCore` 项目中的*YourProjectName*MigrationsDbContextFactory.cs. - -使用以下代码替换*YourProjectName*MigrationsDbContextFactory.cs中的 `CreateDbContext()` 方法: - -```csharp -var builder = new DbContextOptionsBuilder() - .UseSqlServer(configuration.GetConnectionString("Default")); -``` - -与这个 - -```csharp -var builder = (DbContextOptionsBuilder) - new DbContextOptionsBuilder().UseOracle - ( - configuration.GetConnectionString("Default") - ); -``` - -> 根据你的解决方案的结构,你可能发现更多需要改变代码的文件. - -## 更改连接字符串 - -Oracle连接字符串与SQL Server连接字符串不同. 所以检查你的解决方案中所有的 `appsettings.json` 文件,更改其中的连接字符串. 有关oracle连接字符串选项的详细内容请参见[connectionstrings.com](https://www.connectionstrings.com/oracle/). - -通常需要更改 `.DbMigrator` 和 `.Web` 项目里面的 `appsettings.json` ,但它取决于你的解决方案结构. - -## 重新生成迁移 - -启动模板使用[Entity Framework Core的Code First迁移](https://docs.microsoft.com/zh-cn/ef/core/managing-schemas/migrations/). EF Core迁移取决于所选的DBMS提供程序. 因此更改DBMS提供程序会导致迁移失败. - -* 删除 `.EntityFrameworkCore.DbMigrations` 项目下的Migrations文件夹,并重新生成解决方案. -* 在包管理控制台中运行 `Add-Migration "Initial"`(在解决方案资源管理器选择 `.DbMigrator` (或 `.Web`) 做为启动项目并且选择 `.EntityFrameworkCore.DbMigrations` 做为默认项目). - -这将创建一个配置所有数据库对象(表)的数据库迁移. - -运行 `.DbMigrator` 项目创建数据库和初始种子数据. - -## 运行应用程序 - -它已准备就绪, 只需要运行该应用程序与享受编码. \ No newline at end of file +> 你可以选择一个你想要的包,如果你不知道它们之间的区别,请在网站上进行搜索. ABP框架仅提供集成,不提供第三库类库的支持. \ No newline at end of file diff --git a/docs/zh-Hans/Entity-Framework-Core-PostgreSQL.md b/docs/zh-Hans/Entity-Framework-Core-PostgreSQL.md index 350cff65b0..6e481bb230 100644 --- a/docs/zh-Hans/Entity-Framework-Core-PostgreSQL.md +++ b/docs/zh-Hans/Entity-Framework-Core-PostgreSQL.md @@ -8,14 +8,14 @@ ## 替换模块依赖项 -在 `.EntityFrameworkCore` 项目中找到 **YourProjectName*EntityFrameworkCoreModule** 类, 删除 `DependsOn` attribute 上的`typeof(AbpEntityFrameworkCoreSqlServerModule)`, 添加 `typeof(AbpEntityFrameworkCorePostgreSqlModule)` (或者替换 `using Volo.Abp.EntityFrameworkCore.SqlServer;` 为 `using Volo.Abp.EntityFrameworkCore.PostgreSql;`). +在 `.EntityFrameworkCore` 项目中找到 **YourProjectName*EntityFrameworkCoreModule** 类, 删除 `DependsOn` attribute 上的`typeof(AbpEntityFrameworkCoreSqlServerModule)`, 添加 `typeof(AbpEntityFrameworkCorePostgreSqlModule)` (并且替换 `using Volo.Abp.EntityFrameworkCore.SqlServer;` 为 `using Volo.Abp.EntityFrameworkCore.PostgreSql;`). ## UseNpgsql() 查找你的解决方案中 `UseSqlServer()`调用,替换为 `UseNpgsql()`. 检查下列文件: * `.EntityFrameworkCore` 项目中的*YourProjectName*EntityFrameworkCoreModule.cs. -* `.EntityFrameworkCore` 项目中的*YourProjectName*MigrationsDbContextFactory.cs. +* `.EntityFrameworkCore.DbMigrations` 项目中的*YourProjectName*MigrationsDbContextFactory.cs. > 根据你的解决方案的结构,你可能发现更多需要改变代码的文件. diff --git a/docs/zh-Hans/Entity-Framework-Core-SQLite.md b/docs/zh-Hans/Entity-Framework-Core-SQLite.md index d75f8ba5b7..646e3082d5 100644 --- a/docs/zh-Hans/Entity-Framework-Core-SQLite.md +++ b/docs/zh-Hans/Entity-Framework-Core-SQLite.md @@ -8,14 +8,14 @@ ## 替换模块依赖项 -在 `.EntityFrameworkCore` 项目中找到 **YourProjectName*EntityFrameworkCoreModule** 类, 删除 `DependsOn` attribute 上的`typeof(AbpEntityFrameworkCoreSqlServerModule)`, 添加 `typeof(AbpEntityFrameworkCoreSqliteModule)` (或者替换 `using Volo.Abp.EntityFrameworkCore.SqlServer;` 为 `using Volo.Abp.EntityFrameworkCore.Sqlite;`). +在 `.EntityFrameworkCore` 项目中找到 **YourProjectName*EntityFrameworkCoreModule** 类, 删除 `DependsOn` attribute 上的`typeof(AbpEntityFrameworkCoreSqlServerModule)`, 添加 `typeof(AbpEntityFrameworkCoreSqliteModule)` (并且替换 `using Volo.Abp.EntityFrameworkCore.SqlServer;` 为 `using Volo.Abp.EntityFrameworkCore.Sqlite;`). ## UseSqlite() 查找你的解决方案中 `UseSqlServer()`调用,替换为 `UseSqlite()`. 检查下列文件: * `.EntityFrameworkCore` 项目中的*YourProjectName*EntityFrameworkCoreModule.cs. -* `.EntityFrameworkCore` 项目中的*YourProjectName*MigrationsDbContextFactory.cs. +* `.EntityFrameworkCore.DbMigrations` 项目中的*YourProjectName*MigrationsDbContextFactory.cs. > 根据你的解决方案的结构,你可能发现更多需要改变代码的文件. diff --git a/docs/zh-Hans/Tutorials/Part-1.md b/docs/zh-Hans/Tutorials/Part-1.md index e2472bdcee..9a71643a51 100644 --- a/docs/zh-Hans/Tutorials/Part-1.md +++ b/docs/zh-Hans/Tutorials/Part-1.md @@ -737,8 +737,8 @@ $(function () { 是时候创建可见和可用的东西了!开发ABP Angular前端应用程序时,需要使用一些工具: - [Angular CLI](https://angular.io/cli) 用于创建模块,组件和服务. -- [NGXS](https://ngxs.gitbook.io/ngxs/) 用于管理状态库. - [Ng Bootstrap](https://ng-bootstrap.github.io/#/home) 用做UI组件库. +- [ngx-datatable](https://swimlane.gitbook.io/ngx-datatable/) 用做 datatable 类库. - [Visual Studio Code](https://code.visualstudio.com/) 用做代码编辑器 (你可以选择自己喜欢的编辑器). #### 安装 NPM 包 @@ -761,26 +761,56 @@ yarn ng generate module book --routing true #### 路由 -打开位于 `src\app` 目录下的 `app-routing.module.ts` 文件. 添加新的 `import` 和路由: +打开位于 `src\app` 目录下的 `app-routing.module.ts` 文件. 添加新的路由: ```js -import { ApplicationLayoutComponent } from '@abp/ng.theme.basic'; //==> added this line to imports <== +const routes: Routes = [ +// ... +// added a new route to the routes array + { + path: 'books', + loadChildren: () => import('./book/book.module').then(m => m.BookModule) + } +] +``` -//...added book path with the below to the routes array -{ - path: 'book', - component: ApplicationLayoutComponent, - loadChildren: () => import('./book/book.module').then(m => m.BookModule), - data: { - routes: { - name: '::Menu:Book', - iconClass: 'fas fa-book' - } as ABP.Route - }, +* 我们添加了一个懒加载路由. 参阅 [嬾加載功能模块](https://angular.io/guide/lazy-loading-ngmodules#lazy-loading-feature-modules). + +打开位于 `src\app` 目录下的 `route.provider.ts` 文件,用以下内容替换它: + +```js +import { RoutesService, eLayoutType } from '@abp/ng.core'; +import { APP_INITIALIZER } from '@angular/core'; + +export const APP_ROUTE_PROVIDER = [ + { provide: APP_INITIALIZER, useFactory: configureRoutes, deps: [RoutesService], multi: true }, +]; + +function configureRoutes(routes: RoutesService) { + return () => { + routes.add([ + //... + // added below element + { + path: '/books', + name: '::Menu:Books', + iconClass: 'fas fa-book', + order: 101, + layout: eLayoutType.application, + }, + ]); + }; } ``` -* `ApplicationLayoutComponent` 配置将应用程序布局设置为新页面, 我们添加了 `data` 对象. `name` 是菜单项的名称,`iconClass` 是菜单项的图标. +* 我们添加了一个新的路由元素在菜单上显示为 "Books" 的导航元素. + * `path` 路由的URL. + * `name` 菜单项的名称,可以使用本地化Key. + * `iconClass` 菜单项的图标. + * `order` 菜单项的排序.我们定义了101,它显示在 "Administration" 项的后面. + * `layout` BooksModule路由的布局. 可以定义 `eLayoutType.application`, `eLayoutType.account` 或 `eLayoutType.empty`. + +更多信息请参阅[RoutesService 文档](https://docs.abp.io/en/abp/latest/UI/Angular/Modifying-the-Menu.md#via-routesservice). #### Book 列表组件 @@ -848,35 +878,6 @@ yarn start ![Initial book list page](./images/bookstore-initial-book-list-page.png) -#### 创建 BookState - -运行以下命令创建名为 `BookState` 的新state: - -```bash -npx @ngxs/cli --name book --directory src/app/book -``` - -* 此命令在 `src/app/book/state` 文件夹下创建了 `book.state.ts` 和 `book.actions.ts` 文件. 参阅 [NGXS CLI文档](https://www.ngxs.io/plugins/cli)了解更多. - -将 `BookState` 导入到 `src/app` 文件夹中的 `app.module.ts` 中. 然后添加 `BookState` 到 `NgxsModule` 的 `forRoot` 静态方法,作为该方法的第一个参数的数组元素. - -```js -// ... -import { BookState } from './book/state/book.state'; //<== imported BookState ==> - -@NgModule({ - imports: [ - // other imports - - NgxsModule.forRoot([BookState]), //<== added BookState ==> - - //other imports - ], - // ... -}) -export class AppModule {} -``` - #### 生成代理 ABP CLI提供了 `generate-proxy` 命令为你的服务HTTP API生成客户端代理简化客户端使用服务的成本. 运行 `generate-proxy` 命令前你的host必须正在运行. 参阅 [CLI 文档](../CLI.md). @@ -893,109 +894,41 @@ abp generate-proxy --module app ![Generated files](./images/generated-proxies.png) -#### GetBook 动作 - -动作可以被认为是一个命令,它应该触发某些事情发生,或者是已经发生的事情的结果事件.[See NGXS Actions文档](https://www.ngxs.io/concepts/actions). - -打开 `app/book/state` 目录下的 `book.actions.ts` 文件用以下内容替换它: - -```js -export class GetBook { - static readonly type = '[Book] Get'; -} -``` - -#### 实现 BookState - -打开 `app/book/state` 目录下的 `book.state.ts` 文件用以下内容替换它: - -```js -import { PagedResultDto } from '@abp/ng.core'; -import { State, Action, StateContext, Selector } from '@ngxs/store'; -import { GetBooks } from './book.actions'; -import { BookService } from '../services'; -import { tap } from 'rxjs/operators'; -import { Injectable } from '@angular/core'; -import { BookDto } from '../models'; - -export class BookStateModel { - public book: PagedResultDto; -} - -@State({ - name: 'BookState', - defaults: { book: {} } as BookStateModel, -}) -@Injectable() -export class BookState { - @Selector() - static getBooks(state: BookStateModel) { - return state.book.items || []; - } - - constructor(private bookService: BookService) {} - - @Action(GetBooks) - get(ctx: StateContext) { - return this.bookService.getListByInput().pipe( - tap((booksResponse) => { - ctx.patchState({ - book: booksResponse, - }); - }) - ); - } -} -``` - -* 我们添加了book属性到BookStateModel模态框. -* 我们添加了 `GetBook` 动作. 它通过 ABP CLI生成的 `BookService` 检索图书数据. -* `NGXS` 需要在不订阅get函数的情况下返回被观察对象. - #### BookListComponent 打开 `app\book\book-list` 目录下的 `book-list.component.ts` 用以下内容替换它: ```js +import { ListService, PagedResultDto } from '@abp/ng.core'; import { Component, OnInit } from '@angular/core'; -import { Select, Store } from '@ngxs/store'; -import { Observable } from 'rxjs'; -import { finalize } from 'rxjs/operators'; import { BookDto, BookType } from '../models'; -import { GetBooks } from '../state/book.actions'; -import { BookState } from '../state/book.state'; +import { BookService } from '../services'; @Component({ selector: 'app-book-list', templateUrl: './book-list.component.html', styleUrls: ['./book-list.component.scss'], + providers: [ListService], }) export class BookListComponent implements OnInit { - @Select(BookState.getBooks) - books$: Observable; + book = { items: [], totalCount: 0 } as PagedResultDto; booksType = BookType; - loading = false; - - constructor(private store: Store) {} + constructor(public readonly list: ListService, private bookService: BookService) {} ngOnInit() { - this.get(); - } + const bookStreamCreator = (query) => this.bookService.getListByInput(query); - get() { - this.loading = true; - this.store - .dispatch(new GetBooks()) - .pipe(finalize(() => (this.loading = false))) - .subscribe(() => {}); + this.list.hookToQuery(bookStreamCreator).subscribe((response) => { + this.book = response; + }); } } ``` -* 我们添加了 `get` 函数获取book更新store. -* 有关 `NGXS` 特性的更多信息请参见NGXS文档中的[Dispatching actions](https://ngxs.gitbook.io/ngxs/concepts/store#dispatching-actions)和[Select](https://ngxs.gitbook.io/ngxs/concepts/select). +* 我们注入了生成的 `BookService`. +* 我们实现了 [ListService](https://docs.abp.io/en/abp/latest/UI/Angular/List-Service),它是一个公用服务,提供了简单的分页,排序和搜索. 打开 `app\book\book-list` 目录下的 `book-list.component.html` 用以下内容替换它: @@ -1005,38 +938,31 @@ export class BookListComponent implements OnInit {
- {%{{{ "::Menu:Book" | abpLocalization }}}%} + {%{{{ '::Menu:Books' | abpLocalization }}}%}
- - - - - {%{{{ "::Name" | abpLocalization }}}%} - {%{{{ "::Type" | abpLocalization }}}%} - {%{{{ "::PublishDate" | abpLocalization }}}%} - {%{{{ "::Price" | abpLocalization }}}%} - - - - - {%{{{ data.name }}}%} - {%{{{ bookType[data.type] }}}%} - {%{{{ data.publishDate | date }}}%} - {%{{{ data.price }}}%} - - + + + + + {%{{{ booksType[row.type] }}}%} + + + + + {%{{{ row.publishDate | date }}}%} + + + + + {%{{{ row.price | currency }}}%} + + +
``` diff --git a/docs/zh-Hans/Tutorials/Part-2.md b/docs/zh-Hans/Tutorials/Part-2.md index 74a52802b0..5ddc8c2a66 100644 --- a/docs/zh-Hans/Tutorials/Part-2.md +++ b/docs/zh-Hans/Tutorials/Part-2.md @@ -454,78 +454,48 @@ $(function () { 下面的章节中,你将学习到如何创建一个新的模态对话框来新增Book实体. -#### 状态定义 +#### 添加 modal 到 BookListComponent -在 `app\book\state` 文件夹下打开 `book.action.ts` 文件,使用以下内容替换它: -```js -import { CreateUpdateBookDto } from '../models'; //<== added this line ==> - -export class GetBooks { - static readonly type = '[Book] Get'; -} +Open `book-list.component.ts` file in `app\book\book-list` folder and replace the content as below: -// added CreateUpdateBook class -export class CreateUpdateBook { - static readonly type = '[Book] Create Update Book'; - constructor(public payload: CreateUpdateBookDto) { } -} -``` +```js +import { ListService, PagedResultDto } from '@abp/ng.core'; +import { Component, OnInit } from '@angular/core'; +import { BookDto, BookType } from '../models'; +import { BookService } from '../services'; -* 我们导入了 `CreateUpdateBookDto` 模型并且创建了 `CreateUpdateBook` 动作. +@Component({ + selector: 'app-book-list', + templateUrl: './book-list.component.html', + styleUrls: ['./book-list.component.scss'], + providers: [ListService], +}) +export class BookListComponent implements OnInit { + book = { items: [], totalCount: 0 } as PagedResultDto; -打开 `app\book\state` 文件夹下的 `book.state.ts` 文件,使用以下内容替换它: + booksType = BookType; -```js -import { PagedResultDto } from '@abp/ng.core'; -import { State, Action, StateContext, Selector } from '@ngxs/store'; -import { GetBooks, CreateUpdateBook } from './book.actions'; // <== added CreateUpdateBook==> -import { BookService } from '../services'; -import { tap } from 'rxjs/operators'; -import { Injectable } from '@angular/core'; -import { BookDto } from '../models'; + isModalOpen = false; // <== added this line ==> -export class BookStateModel { - public book: PagedResultDto; -} + constructor(public readonly list: ListService, private bookService: BookService) {} -@State({ - name: 'BookState', - defaults: { book: {} } as BookStateModel, -}) -@Injectable() -export class BookState { - @Selector() - static getBooks(state: BookStateModel) { - return state.book.items || []; - } + ngOnInit() { + const bookStreamCreator = (query) => this.bookService.getListByInput(query); - constructor(private bookService: BookService) {} - - @Action(GetBooks) - get(ctx: StateContext) { - return this.bookService.getListByInput().pipe( - tap((bookResponse) => { - ctx.patchState({ - book: bookResponse, - }); - }) - ); + this.list.hookToQuery(bookStreamCreator).subscribe((response) => { + this.book = response; + }); } - // added CreateUpdateBook action listener - @Action(CreateUpdateBook) - save(ctx: StateContext, action: CreateUpdateBook) { - return this.bookService.createByInput(action.payload); + // added createBook method + createBook() { + this.isModalOpen = true; } } ``` -* 我们导入了 `CreateUpdateBook` 动作并且定义了 `save` 方法监听 `CreateUpdateBook` 动作去创建图书. - -当 `SaveBook` 动作被分派时,save方法被执行. 它调用 `BookService` 的 `createByInput` 方法. - -#### 添加模态到 BookListComponent +* 我们定义了一个名为 `isModalOpen` 的变量和 `createBook` 方法. 打开 `app\book\book-list` 文件夹内的 `book-list.component.html` 文件,使用以下内容替换它: @@ -534,19 +504,12 @@ export class BookState {
-
- {%{{{ '::Menu:Books' | abpLocalization }}}%} -
+
{%{{{ '::Menu:Books' | abpLocalization }}}%}
- +
- @@ -555,47 +518,40 @@ export class BookState {
- - - - - {%{{{ "::Name" | abpLocalization }}}%} - {%{{{ "::Type" | abpLocalization }}}%} - {%{{{ "::PublishDate" | abpLocalization }}}%} - {%{{{ "::Price" | abpLocalization }}}%} - - - - - {%{{{ data.name }}}%} - {%{{{ bookType[data.type] }}}%} - {%{{{ data.publishDate | date }}}%} - {%{{{ data.price }}}%} - - + + + + + {%{{{ booksType[row.type] }}}%} + + + + + {%{{{ row.publishDate | date }}}%} + + + + + {%{{{ row.price | currency }}}%} + + +
- -

{%{{{ '::NewBook' | abpLocalization }}}%}

-
+ +

{%{{{ '::NewBook' | abpLocalization }}}%}

+
- + - - - + + +
``` @@ -603,55 +559,6 @@ export class BookState { * `abp-modal` 是显示模态框的预构建组件. 你也可以使用其它方法显示模态框,但 `abp-modal` 提供了一些附加的好处. * 我们添加了 `New book` 按钮到 `AbpContentToolbar`. -打开 `app\book\book-list` 文件夹下的 `book-list.component.ts` 文件,使用以下内容替换它: - -```js -import { Component, OnInit } from '@angular/core'; -import { Select, Store } from '@ngxs/store'; -import { Observable } from 'rxjs'; -import { finalize } from 'rxjs/operators'; -import { BookDto, BookType } from '../models'; -import { GetBooks } from '../state/book.actions'; -import { BookState } from '../state/book.state'; - -@Component({ - selector: 'app-book-list', - templateUrl: './book-list.component.html', - styleUrls: ['./book-list.component.scss'], -}) -export class BookListComponent implements OnInit { - @Select(BookState.getBooks) - books$: Observable; - - booksType = BookType; - - loading = false; - - isModalOpen = false; // <== added this line ==> - - constructor(private store: Store) {} - - ngOnInit() { - this.get(); - } - - get() { - this.loading = true; - this.store - .dispatch(new GetBooks()) - .pipe(finalize(() => (this.loading = false))) - .subscribe(() => {}); - } - - // added createBook method - createBook() { - this.isModalOpen = true; - } -} -``` - -* 我们添加了 `isModalOpen = false` 和 `createBook` 方法. - 你可以打开浏览器,点击**New book**按钮看到模态框. ![Empty modal for new book](./images/bookstore-empty-new-book-modal.png) @@ -660,51 +567,46 @@ export class BookListComponent implements OnInit { [响应式表单](https://angular.io/guide/reactive-forms) 提供一种模型驱动的方法来处理其值随时间变化的表单输入. -打开 `app\app\book\book-list` 文件夹下的 `book-list.component.ts` 文件,使用以下内容替换它: +打开 `app\book\book-list` 文件夹下的 `book-list.component.ts` 文件,使用以下内容替换它: ```js +import { ListService, PagedResultDto } from '@abp/ng.core'; import { Component, OnInit } from '@angular/core'; -import { Select, Store } from '@ngxs/store'; -import { Observable } from 'rxjs'; -import { finalize } from 'rxjs/operators'; import { BookDto, BookType } from '../models'; -import { GetBooks } from '../state/book.actions'; -import { BookState } from '../state/book.state'; +import { BookService } from '../services'; import { FormGroup, FormBuilder, Validators } from '@angular/forms'; // <== added this line ==> @Component({ selector: 'app-book-list', templateUrl: './book-list.component.html', styleUrls: ['./book-list.component.scss'], + providers: [ListService], }) export class BookListComponent implements OnInit { - @Select(BookState.getBooks) - books$: Observable; + book = { items: [], totalCount: 0 } as PagedResultDto; booksType = BookType; - loading = false; - isModalOpen = false; form: FormGroup; // <== added this line ==> - constructor(private store: Store, private fb: FormBuilder) {} // <== added FormBuilder ==> + constructor( + public readonly list: ListService, + private bookService: BookService, + private fb: FormBuilder // <== injected FormBuilder ==> + ) {} ngOnInit() { - this.get(); - } + const bookStreamCreator = (query) => this.bookService.getListByInput(query); - get() { - this.loading = true; - this.store - .dispatch(new GetBooks()) - .pipe(finalize(() => (this.loading = false))) - .subscribe(() => {}); + this.list.hookToQuery(bookStreamCreator).subscribe((response) => { + this.book = response; + }); } createBook() { - this.buildForm(); //<== added this line ==> + this.buildForm(); // <== added this line ==> this.isModalOpen = true; } @@ -729,7 +631,7 @@ export class BookListComponent implements OnInit { #### 创建表单的DOM元素 -打开 `app\app\book\book-list` 文件夹下的 `book-list.component.html` 文件,使用以下内容替换 ` `: +打开 `app\book\book-list` 文件夹下的 `book-list.component.html` 文件,使用以下内容替换 ` `: ```html @@ -798,16 +700,13 @@ export class BooksModule { } * 我们导入了 `NgbDatepickerModule` 来使用日期选择器. -打开 `app\app\book\book-list` 文件夹下的 `book-list.component.ts` 文件,使用以下内容替换它: +打开 `app\book\book-list` 文件夹下的 `book-list.component.ts` 文件,使用以下内容替换它: ```js +import { ListService, PagedResultDto } from '@abp/ng.core'; import { Component, OnInit } from '@angular/core'; -import { Select, Store } from '@ngxs/store'; -import { Observable } from 'rxjs'; -import { finalize } from 'rxjs/operators'; import { BookDto, BookType } from '../models'; -import { GetBooks } from '../state/book.actions'; -import { BookState } from '../state/book.state'; +import { BookService } from '../services'; import { FormGroup, FormBuilder, Validators } from '@angular/forms'; import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap'; // <== added this line ==> @@ -815,37 +714,34 @@ import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap selector: 'app-book-list', templateUrl: './book-list.component.html', styleUrls: ['./book-list.component.scss'], - providers: [{ provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], // <== added this line ==> + providers: [ListService, { provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], // <== added a provide ==> }) export class BookListComponent implements OnInit { - @Select(BookState.getBooks) - books$: Observable; + book = { items: [], totalCount: 0 } as PagedResultDto; booksType = BookType; - //added bookTypeArr array + // <== added bookTypeArr array ==> bookTypeArr = Object.keys(BookType).filter( (bookType) => typeof this.booksType[bookType] === 'number' ); - loading = false; - isModalOpen = false; form: FormGroup; - constructor(private store: Store, private fb: FormBuilder) {} + constructor( + public readonly list: ListService, + private bookService: BookService, + private fb: FormBuilder + ) {} ngOnInit() { - this.get(); - } + const bookStreamCreator = (query) => this.bookService.getListByInput(query); - get() { - this.loading = true; - this.store - .dispatch(new GetBooks()) - .pipe(finalize(() => (this.loading = false))) - .subscribe(() => {}); + this.list.hookToQuery(bookStreamCreator).subscribe((response) => { + this.book = response; + }); } createBook() { @@ -882,16 +778,13 @@ export class BookListComponent implements OnInit { #### 保存图书 -打开 `app\app\book\book-list` 文件夹下的 `book-list.component.ts` 文件,使用以下内容替换它: +打开 `app\book\book-list` 文件夹下的 `book-list.component.ts` 文件,使用以下内容替换它: ```js +import { ListService, PagedResultDto } from '@abp/ng.core'; import { Component, OnInit } from '@angular/core'; -import { Select, Store } from '@ngxs/store'; -import { Observable } from 'rxjs'; -import { finalize } from 'rxjs/operators'; import { BookDto, BookType } from '../models'; -import { GetBooks, CreateUpdateBook } from '../state/book.actions'; // <== added CreateUpdateBook ==> -import { BookState } from '../state/book.state'; +import { BookService } from '../services'; import { FormGroup, FormBuilder, Validators } from '@angular/forms'; import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap'; @@ -899,11 +792,10 @@ import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap selector: 'app-book-list', templateUrl: './book-list.component.html', styleUrls: ['./book-list.component.scss'], - providers: [{ provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], + providers: [ListService, { provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], }) export class BookListComponent implements OnInit { - @Select(BookState.getBooks) - books$: Observable; + book = { items: [], totalCount: 0 } as PagedResultDto; booksType = BookType; @@ -911,24 +803,22 @@ export class BookListComponent implements OnInit { (bookType) => typeof this.booksType[bookType] === 'number' ); - loading = false; - isModalOpen = false; form: FormGroup; - constructor(private store: Store, private fb: FormBuilder) {} + constructor( + public readonly list: ListService, + private bookService: BookService, + private fb: FormBuilder + ) {} ngOnInit() { - this.get(); - } + const bookStreamCreator = (query) => this.bookService.getListByInput(query); - get() { - this.loading = true; - this.store - .dispatch(new GetBooks()) - .pipe(finalize(() => (this.loading = false))) - .subscribe(() => {}); + this.list.hookToQuery(bookStreamCreator).subscribe((response) => { + this.book = response; + }); } createBook() { @@ -951,19 +841,18 @@ export class BookListComponent implements OnInit { return; } - this.store.dispatch(new CreateUpdateBook(this.form.value)).subscribe(() => { + this.bookService.createByInput(this.form.value).subscribe(() => { this.isModalOpen = false; this.form.reset(); - this.get(); + this.list.get(); }); } } ``` -* 我们导入了 `CreateUpdateBook`. * 我们添加了 `save` 方法. -打开 `app\app\book\book-list` 文件夹下的 `app\app\book\book-list`文件, 添加 `abp-button` 保存图书. +打开 `app\book\book-list` 文件夹下的 `book-list.component.html` 文件, 找到 `` 元素,使用下面元素替换它: ```html @@ -994,90 +883,49 @@ export class BookListComponent implements OnInit { ### 更新图书 -#### CreateUpdateBook 动作 - -打开 `app\book\state` 文件夹下的 `book.actions.ts` 文件,使用以下内容替换它: - -```js -import { CreateUpdateBookDto } from '../models'; - -export class GetBooks { - static readonly type = '[Book] Get'; -} - -export class CreateUpdateBook { - static readonly type = '[Book] Create Update Book'; - constructor(public payload: CreateUpdateBookDto, public id?: string) {} // <== added id parameter ==> -} -``` - -* 我们在 `CreateUpdateBook` 动作的构造函数添加了 `id` 参数. - -打开 `app\book\state` 文件夹下的 `book.state.ts` 文件,使用以下内容替换 `save` 方法: - -```js -@Action(CreateUpdateBook) -save(ctx: StateContext, action: CreateUpdateBook) { - if (action.id) { - return this.bookService.updateByIdAndInput(action.payload, action.id); - } else { - return this.bookService.createByInput(action.payload); - } -} -``` - -#### BookListComponent - -打开 `app\app\book\book-list` 文件夹下的 `book-list.component.ts` 文件,在构造函数注入 `BookService` 服务,并添加 名为 `selectedBook` 的变量. +打开 `app\book\book-list` 文件夹下的 `book-list.component.ts` 文件并且添加名为 `selectedBook` 的变量. ```js +import { ListService, PagedResultDto } from '@abp/ng.core'; import { Component, OnInit } from '@angular/core'; -import { Select, Store } from '@ngxs/store'; -import { Observable } from 'rxjs'; -import { finalize } from 'rxjs/operators'; import { BookDto, BookType } from '../models'; -import { GetBooks, CreateUpdateBook } from '../state/book.actions'; -import { BookState } from '../state/book.state'; +import { BookService } from '../services'; import { FormGroup, FormBuilder, Validators } from '@angular/forms'; import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap'; -import { BookService } from '../services'; // <== imported BookService ==> @Component({ selector: 'app-book-list', templateUrl: './book-list.component.html', styleUrls: ['./book-list.component.scss'], - providers: [{ provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], + providers: [ListService, { provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], }) export class BookListComponent implements OnInit { - @Select(BookState.getBooks) - book$: Observable; + book = { items: [], totalCount: 0 } as PagedResultDto; - bookType = BookType; + booksType = BookType; bookTypeArr = Object.keys(BookType).filter( - (bookType) => typeof this.bookType[bookType] === 'number' + (bookType) => typeof this.booksType[bookType] === 'number' ); - loading = false; - isModalOpen = false; form: FormGroup; selectedBook = {} as BookDto; // <== declared selectedBook ==> - constructor(private store: Store, private fb: FormBuilder, private bookService: BookService) {} //<== injected BookService ==> + constructor( + public readonly list: ListService, + private bookService: BookService, + private fb: FormBuilder + ) {} ngOnInit() { - this.get(); - } + const bookStreamCreator = (query) => this.bookService.getListByInput(query); - get() { - this.loading = true; - this.store - .dispatch(new GetBooks()) - .pipe(finalize(() => (this.loading = false))) - .subscribe(() => {}); + this.list.hookToQuery(bookStreamCreator).subscribe((response) => { + this.book = response; + }); } // <== this method is replaced ==> @@ -1109,58 +957,46 @@ export class BookListComponent implements OnInit { }); } + // <== this method is replaced ==> save() { if (this.form.invalid) { return; } - //<== added this.selectedBook.id ==> - this.store - .dispatch(new CreateUpdateBook(this.form.value, this.selectedBook.id)) - .subscribe(() => { - this.isModalOpen = false; - this.form.reset(); - this.get(); - }); + // <== added request ==> + const request = this.selectedBook.id + ? this.bookService.updateByIdAndInput(this.form.value, this.selectedBook.id) + : this.bookService.createByInput(this.form.value); + + request.subscribe(() => { + this.isModalOpen = false; + this.form.reset(); + this.list.get(); + }); } } ``` -* 我们导入了 `BookService`. * 我们声明了类型为 `BookDto` 的 `selectedBook` 变量. -* 我们在构造函数注入了 `BookService`, 它用于检索正在编辑的图书数据. * 我们添加了 `editBook` 方法, 根据给定图书 `Id` 设置 `selectedBook` 对象. * 我们替换了 `buildForm` 方法使用 `selectedBook` 数据创建表单. * 我们替换了 `createBook` 方法,设置 `selectedBook` 为空对象. -* 我们在 `CreateUpdateBook` 构造函数添加了 `selectedBook.id`. +* 我们替换了 `save` 方法. #### 添加 "Actions" 下拉框到表格 -打开 `app\app\book\book-list` 文件夹下的 `book-list.component.html` 文件,使用以下内容替换 `
` 标签: +打开 `app\book\book-list` 文件夹下的 `book-list.component.html` 文件,使用以下内容替换 `
` 标签: ```html
- - - - - {%{{{ "::Actions" | abpLocalization }}}%} - {%{{{ "::Name" | abpLocalization }}}%} - {%{{{ "::Type" | abpLocalization }}}%} - {%{{{ "::PublishDate" | abpLocalization }}}%} - {%{{{ "::Price" | abpLocalization }}}%} - - - - - + + + +
-
- - {%{{{ data.name }}}%} - {%{{{ bookType[data.type] }}}%} - {%{{{ data.publishDate | date }}}%} - {%{{{ data.price }}}%} - -
+
+ + + + + {%{{{ booksType[row.type] }}}%} + + + + + {%{{{ row.publishDate | date }}}%} + + + + + {%{{{ row.price | currency }}}%} + + +
``` - 我们添加了 "Actions" 栏的 `th`. +- 我们为 "Actions" 栏添加了 `ngx-datatable-column`. - 我们添加了带有 `ngbDropdownToggle` 的 `button`,在点击按钮时打开操作. - 我们习惯于将[NgbDropdown](https://ng-bootstrap.github.io/#/components/dropdown/examples)用于操作的下拉菜单. @@ -1194,7 +1043,7 @@ UI最终看起来像这样: ![Action buttons](./images/bookstore-actions-buttons.png) -打开 `app\app\book\book-list` 文件夹下的 `book-list.component.html` 文件,使用以下内容替换 `` 标签: +打开 `app\book\book-list` 文件夹下的 `book-list.component.html` 文件,使用以下内容替换 `` 标签: ```html @@ -1206,80 +1055,9 @@ UI最终看起来像这样: ### 删除图书 -#### DeleteBook 动作 - -打开 `app\book\state` 文件夹下的 `book.actions.ts` 文件添加名为 `DeleteBook` 的动作. - -```js -export class DeleteBook { - static readonly type = '[Book] Delete'; - constructor(public id: string) {} -} -``` - -打开 `app\book\state` 文件夹下的 `book.state.ts` 文件,使用以下内容替换它: - -```js -import { PagedResultDto } from '@abp/ng.core'; -import { State, Action, StateContext, Selector } from '@ngxs/store'; -import { GetBooks, CreateUpdateBook, DeleteBook } from './book.actions'; // <== added DeleteBook==> -import { BookService } from '../services'; -import { tap } from 'rxjs/operators'; -import { Injectable } from '@angular/core'; -import { BookDto } from '../models'; - -export class BookStateModel { - public book: PagedResultDto; -} - -@State({ - name: 'BookState', - defaults: { book: {} } as BookStateModel, -}) -@Injectable() -export class BookState { - @Selector() - static getBooks(state: BookStateModel) { - return state.book.items || []; - } - - constructor(private bookService: BookService) {} - - @Action(GetBooks) - get(ctx: StateContext) { - return this.bookService.getListByInput().pipe( - tap((booksResponse) => { - ctx.patchState({ - book: booksResponse, - }); - }) - ); - } - - @Action(CreateUpdateBook) - save(ctx: StateContext, action: CreateUpdateBook) { - if (action.id) { - return this.bookService.updateByIdAndInput(action.payload, action.id); - } else { - return this.bookService.createByInput(action.payload); - } - } - - // <== added DeleteBook action listener ==> - @Action(DeleteBook) - delete(ctx: StateContext, action: DeleteBook) { - return this.bookService.deleteById(action.id); - } -} -``` - -- 我们导入了 `DeleteBook` . - -- 我们在文件末尾添加了 `DeleteBook` 动作监听器. - #### 删除确认弹层 -打开 `app\app\book\book-list` 文件夹下的 `book-list.component.ts` 文件,注入 `ConfirmationService`. +打开 `app\book\book-list` 文件夹下的 `book-list.component.ts` 文件,注入 `ConfirmationService`. 替换构造函数: @@ -1288,50 +1066,46 @@ import { ConfirmationService } from '@abp/ng.theme.shared'; //... constructor( - private store: Store, - private fb: FormBuilder, - private bookService: BookService, - private confirmation: ConfirmationService // <== added this line ==> -) { } + public readonly list: ListService, + private bookService: BookService, + private fb: FormBuilder, + private confirmation: ConfirmationService // <== added this line ==> +) {} ``` -* 我们导入了 `ConfirmationService`. -* 我们在构造函数注入了 `ConfirmationService` . +* We imported `ConfirmationService`. +* We injected `ConfirmationService` to the constructor. -参阅[确认弹层文档](https://docs.abp.io/en/abp/latest/UI/Angular/Confirmation-Service)了解更多 +See the [Confirmation Popup documentation](https://docs.abp.io/en/abp/latest/UI/Angular/Confirmation-Service) -在 `book-list.component.ts` 中添加删除方法: +In the `book-list.component.ts` add a delete method: ```js -import { GetBooks, CreateUpdateBook, DeleteBook } from '../state/book.actions' ;// <== imported DeleteBook ==> - -import { ConfirmationService, Confirmation } from '@abp/ng.theme.shared'; //<== imported Confirmation ==> +import { ConfirmationService, Confirmation } from '@abp/ng.theme.shared'; //<== imported Confirmation namespace ==> //... delete(id: string) { - this.confirmation - .warn('::AreYouSureToDelete', 'AbpAccount::AreYouSure') - .subscribe(status => { - if (status === Confirmation.Status.confirm) { - this.store.dispatch(new DeleteBook(id)).subscribe(() => this.get()); - } - }); + this.confirmation.warn('::AreYouSureToDelete', 'AbpAccount::AreYouSure').subscribe((status) => { + if (status === Confirmation.Status.confirm) { + this.bookService.deleteById(id).subscribe(() => this.list.get()); + } + }); } ``` -`delete` 方法会显示一个确认弹层并订阅用户响应. 只在用户点击 `Yes` 按钮时分派动作. 确认弹层看起来如下: +`delete` 方法会显示一个确认弹层并订阅用户响应. 只在用户点击 `Yes` 按钮时调用 `BookService` 的 `deleteById` 方法. 确认弹层看起来如下: ![bookstore-confirmation-popup](./images/bookstore-confirmation-popup.png) #### 添加删除按钮 -打开 `app\app\book\book-list` 文件夹下的 `app\app\book\book-list` 文件,修改 `ngbDropdownMenu` 添加删除按钮: +打开 `app\book\book-list` 文件夹下的 `app\book\book-list` 文件,修改 `ngbDropdownMenu` 添加删除按钮: ```html
-
diff --git a/docs/zh-Hans/Tutorials/images/bookstore-actions-buttons.png b/docs/zh-Hans/Tutorials/images/bookstore-actions-buttons.png index e8243fedc7f88a85060ca27e13a10281acca59a4..f5d8f0870b88e9ffcac770a03481ac871beeccb2 100644 GIT binary patch literal 25169 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 DHD`U8 literal 29435 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 fYg-%~f_M&aj@0}w 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 diff --git a/docs/zh-Hans/Tutorials/images/bookstore-angular-file-tree.png b/docs/zh-Hans/Tutorials/images/bookstore-angular-file-tree.png index ffa8dcd7e2862f91d03ffb41912a83d2f0b9ecd4..d921f146fcc6011e2b1bb57549bee6b48a4e961e 100644 GIT binary patch delta 25483 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

Ez_}*2mvirl~=KAqRDIj=w8YOVk$Y?KJ_i| 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 delta 34041 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Μ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 literal 49861 zcmZ^~1zcUb(muR#cemp1?heJJxJz+&XX9FmTZ>bQySux)yUQ-_{^z{+zVh93zRg;{ zm6gmSGn18M=1GWDR+K`5$A@5-I=y>9>`+%Hv@YAuce#m>%9mv(K5+o^r9Pu!o2<9C)l9(V*Pf^iabaCOW zq+2MZ31ObvFdnbA4AQa+Nyzj;}0X5Nc`C*vUC%cz37X2F7*h zvm|Hnru_q=Whj@r)gt>Stg=|NzY^x(ig*nt0tF#HqqZV=8c(C9ixZL#$3{;t)zfcGyil`^$iaVtITnc1KM@OS}pOPw&Rz7fmVU?qaL{z^v!CS70fQ;^} z6A{v4)?h++G2v`#kxs(QKSOEAoK)R+0C!4M?os@-hc+@eh`2z88Wvh=Gq@6(V5-o* zq;K`bGRWMnl0(>FH#RZ!Fs&BI`v zVB9V+;{Z5Jg?#A3XqgrN)aIt*A)UY?pdT+9#p-3*Fd3l)La;Bnryp4seTzn#9qeo^ zBd4`6gWKdYMU}qtuztst{7%BRYwn5qDPXY623AceBlH=`{CPS1B4SFkNvTQfh+^#r z15+|Ec~ol(?vb1W%L1s)dIsQazf=}Ltr0h0gXM;>f1tq)kA~?T+L#)d-YYN5d~`S= zEZK_6vU#C7!%X@r50}dWY*$&8T=j{NT%Klr&YR%0DJsp#{aLx|(s5J^h?zF@`HE20 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 BJY@g? diff --git a/docs/zh-Hans/Tutorials/images/bookstore-confirmation-popup.png b/docs/zh-Hans/Tutorials/images/bookstore-confirmation-popup.png index a80b180f1cbadef03f1caca75680e7d8d692bcfa..b17e70638db3a921eac3ca99beda6a89dabecf25 100644 GIT binary patch literal 23065 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±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≤o%uGZbZ-PeHEuAT*AjTYxn2LD}5xm`wjcV55WBF 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

&HdfV}XRVHSBjTb=YU$P{E=?JfCdtAoQ8|z$ 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 diff --git a/docs/zh-Hans/UI/Angular/List-Service.md b/docs/zh-Hans/UI/Angular/List-Service.md index 6d5bc6f1ef..39275fdf10 100644 --- a/docs/zh-Hans/UI/Angular/List-Service.md +++ b/docs/zh-Hans/UI/Angular/List-Service.md @@ -53,57 +53,38 @@ class BookComponent { > 注意 `list` 是 `public` 并且 `readonly`. 因为我们将直接在组件的模板中使用 `ListService` 属性. 可以视为反模式,但是实现起来要快得多. 你可以改为使用公共组件属性. -将 `ListService` 属性放入模板中,如下所示: +像这样绑定 `ListService` 到 ngx-datatable: ```html - - - - - - - {%{{{ '::Name' | abpLocalization }}}%} - - - - - - - - {%{{{ data.name }}}%} - - + + ``` ## 与Observables一起使用 你可以将Observables与Angular的[AsyncPipe](https://angular.io/guide/observables-in-angular#async-pipe)结合使用: -```ts +```js book$ = this.list.hookToQuery(query => this.bookService.getListByInput(query)); ``` ```html - - + + ``` @@ -111,7 +92,7 @@ class BookComponent { ...or... -```ts +```js @Select(BookState.getBooks) books$: Observable; @@ -126,13 +107,18 @@ class BookComponent { ```html - - + + ``` +> 我们不建议将NGXS存储用于CRUD页面,除非你的应用程序需要在组件之间共享列表信息或稍后在另一页面中使用它. + ## 如何在创建/更新/删除时刷新表 `ListService` 公开了一个 `get` 方法来触发当前查询的请求. 因此基本上每当创建,更新或删除操作解析时,你可以调用 `this.list.get();` 它会调用钩子流创建者. @@ -161,3 +147,26 @@ this.bookService.createByInput(form.value) ``` + +## ABP v3.0的重大更改 + +我们必须修改 `ListService` 使其与 `ngx-datatable` 一起使用. 之前 `page` 属性的最小值为 `1`, 你可以像这样使用它: + +```html + + +``` + +从v3.0开始, 对于`ngx-datatable`, 初始页面的 `page`属性必须设置为 `0`. 因此如果你以前在表上使用过 `ListService` 并打算保留 `abp-table`,则需要进行以下更改: + +```html + + +``` + +**重要提示:** `abp-table` 没有被删除,但是会被弃用,并在将来的版本中移除,请考虑切换到 ngx-datatable. \ No newline at end of file diff --git a/docs/zh-Hans/UI/Angular/Migration-Guide-v3.md b/docs/zh-Hans/UI/Angular/Migration-Guide-v3.md new file mode 100644 index 0000000000..36afffa54f --- /dev/null +++ b/docs/zh-Hans/UI/Angular/Migration-Guide-v3.md @@ -0,0 +1,363 @@ +# Angular UI v2.9 迁移到 v3.0 指南 + +## 在v3.0改变了什么? + +### Angular 10 + +新的ABP Angular UI基于Angular 10和TypeScript 3.9,我们已经放弃了对Angular 8的支持. 不过ABP模块将继续与Angular 9兼容使用. 因此如果你的项目是Angular 9,则无需更新为 Angular10. 更新通常很容易. + +#### 如何迁移? + +在你的根文件夹中打开一个终端,然后运行以下命令: + +```sh +yarn ng update @angular/cli @angular/core --force +``` + +这会做如下修改: + +- 更新你的package.json并安装新的软件包 +- 修改tsconfig.json文件创建一个"Solution Style"配置 +- 重命名 `browserlist` 为 `.browserlistrc` + +另一方面,如果你单独使用 `yarn ng update` 命令检查首先要更新哪些包会更好. Angular会给你一个要更新的包列表. + +![Table of packages to update](./images/table-of-packages-to-update.png) + +当Angular报告上面的包后,运行命令: + +```sh +yarn ng update @angular/cli @angular/core ng-zorro-antd --force +``` + +> 如果Angular提示你的仓库有中未提交的更改,可以提交/存储它,也可以在命令中添加 `--allow-dirty` 参数. + +### 配置模块 + +在ABP v2.x中,每个延迟加载的模块都有一个可通过单独的程序包使用的配置模块,模块配置如下: + +```js +import { AccountConfigModule } from '@abp/ng.account.config'; + +@NgModule({ + imports: [ + // other imports + AccountConfigModule.forRoot({ redirectUrl: '/' }), + ], + // providers, declarations, and bootstrap +}) +export class AppModule {} +``` + +...在app-routing.module.ts... + +```js +const routes: Routes = [ + // other route configuration + { + path: 'account', + loadChildren: () => import( + './lazy-libs/account-wrapper.module' + ).then(m => m.AccountWrapperModule), + }, +]; +``` + +虽然有效,但有一些缺点: + +- 每个模块都有两个独立的程序包,但实际上这些程序包是相互依赖的. +- 配置延迟加载的模块需要包装模块. +- ABP Commercial具有可扩展性系统,在根模块上配置可扩展模块会增加 bundle 的大小. + +在ABP v3.0中,我们为每个配置模块引入了辅助入口点,并且提供了一种在没有包装的情况下配置延迟加载的模块的新方法. 现在模块配置如下所示: + +```js +import { AccountConfigModule } from '@abp/ng.account/config'; + +@NgModule({ + imports: [ + // other imports + AccountConfigModule.forRoot(), + ], + // providers, declarations, and bootstrap +}) +export class AppModule {} +``` + +... 在app-routing.module.ts... + +```js +const routes: Routes = [ + // other route configuration + { + path: 'account', + loadChildren: () => import('@abp/ng.account') + .then(m => m.AccountModule.forLazy({ redirectUrl: '/' })), + }, +]; +``` + +这项更改帮助我们减少了捆绑包的大小并大大缩短了构建时间. 我们相信你会注意到你的应用程序有所不同. + +#### 一个更好的例子 + +AppModule: + +```js +import { AccountConfigModule } from '@abp/ng.account/config'; +import { CoreModule } from '@abp/ng.core'; +import { IdentityConfigModule } from '@abp/ng.identity/config'; +import { SettingManagementConfigModule } from '@abp/ng.setting-management/config'; +import { TenantManagementConfigModule } from '@abp/ng.tenant-management/config'; +import { ThemeBasicModule } from '@abp/ng.theme.basic'; +import { ThemeSharedModule } from '@abp/ng.theme.shared'; +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { NgxsModule } from '@ngxs/store'; +import { environment } from '../environments/environment'; +import { AppRoutingModule } from './app-routing.module'; + +@NgModule({ + imports: [ + BrowserModule, + BrowserAnimationsModule, + AppRoutingModule, + CoreModule.forRoot({ + environment, + sendNullsAsQueryParam: false, + skipGetAppConfiguration: false, + }), + ThemeSharedModule.forRoot(), + AccountConfigModule.forRoot(), + IdentityConfigModule.forRoot(), + TenantManagementConfigModule.forRoot(), + SettingManagementConfigModule.forRoot(), + ThemeBasicModule.forRoot(), + NgxsModule.forRoot(), + ], + // providers, declarations, and bootstrap +}) +export class AppModule {} +``` + +AppRoutingModule: + +```js +import { DynamicLayoutComponent } from '@abp/ng.core'; +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +const routes: Routes = [ + { + path: '', + component: DynamicLayoutComponent, + children: [ + { + path: '', + pathMatch: 'full', + loadChildren: () => import('./home/home.module') + .then(m => m.HomeModule), + }, + { + path: 'account', + loadChildren: () => import('@abp/ng.account') + .then(m => m.AccountModule.forLazy({ redirectUrl: '/' })), + }, + { + path: 'identity', + loadChildren: () => import('@abp/ng.identity') + .then(m => m.IdentityModule.forLazy()), + }, + { + path: 'tenant-management', + loadChildren: () => import('@abp/ng.tenant-management') + .then(m => m.TenantManagementModule.forLazy()), + }, + { + path: 'setting-management', + loadChildren: () => import('@abp/ng.setting-management') + .then(m => m.SettingManagementModule.forLazy()), + }, + ], + }, +]; + +@NgModule({ + imports: [RouterModule.forRoot(routes)], + exports: [RouterModule], +}) +export class AppRoutingModule {} +``` + +> 你可能已经注意到我们在top级别路由组件上使用了 `DynamicLayoutComponent`. 我们这样做是为了避免不必要的渲染和闪烁. 这不是强制的,但是我们建议在你的应用程序路由中做同样的事情. + +#### 如何迁移? + +- 使用 `yarn remove` 删除你的项目的配置包. +- 从辅助入口点(例如`@abp/ng.identity/config`)导入配置模块. +- 调用所有新配置模块的静态 `forRoot`方法,即使配置没有被传递. +- 调用 `ThemeBasicModule` 的静态 `forRoot` 方法(或商业上的 `ThemeLeptonModule`),并从导入中删除 `SharedModule`(除非已在其中添加了根模块所需的任何内容). +- 在app路由模块中直接导入延迟ABP模块 (如 `() => import('@abp/ng.identity').then(...)`). +- 在所有延迟模块 `then` 中调用的静态 `forLazy` 方法,即使配置没有被传递. +- [可选]使用 `DynamicLayoutComponent` 添加空的父路由,获得更好的性能和UX. + +### RoutesService + +在ABP v2.x中,通过以下两种方式之一将路由添加到菜单: + +- [通过 `AppRoutingModule` 的 `routes` 属性](https://docs.abp.io/en/abp/2.9.0/UI/Angular/Modifying-the-Menu#via-routes-property-in-approutingmodule) +- [通过 ConfigState](https://docs.abp.io/en/abp/2.9.0/UI/Angular/Modifying-the-Menu#via-configstate) + +从v3.0开始,我们更改了添加和修改路由的方式. 我们不再将路由存储在 `ConfigState`中(破坏性更改). 而是有一个名为 `RoutesService` 的新服务,该服务用于添加,修补或删除菜单项. 详情请查看[文档](Modifying-the-Menu.md). + +#### 如何迁移? + +- 检查你是否曾经使用 `ConfigState` 或 `ConfigStateService` 添加路由. 请用 `RoutesService` 的 `add` 方法替换它们. +- 检查你是否曾经修补的路由. 将其替换为 `RoutesService` 的 `patch` 方法. +- 仔细检查你是否使用绝对路径,并在 `add` 或 `patch` 方法调用中为子菜单项提供 `parentName` 而不是 `children` 属性. + +### NavItemsService + +在ABP v2.x中,[通过LayoutStateService](https://docs.abp.io/en/abp/2.9.0/UI/Angular/Modifying-the-Menu#how-to-add-an-element-to-right-part-of-the-menu)添加导航元素. + +从v3.0开始,我们改变了添加和修改导航项的方式,以前的方法不再可用(破坏性更改). 详情请查看[文档](Modifying-the-Menu.md). + +#### 如何迁移? + +- 用 `NavItemsService` 的 `addItems` 方法替换所有 `dispatchAddNavigationElement` 调用. + +### ngx-datatable + +在v3之前,我们一直使用自定义组件 `abp-table` 作为默认表. 但是数据表是复杂的组件,要实现功能齐全的数据表需要大量的精力,我们计划将其引入其他功能. + +从ABP v3开始,我们已切换到经过严格测试,执行良好的数据表格:[ngx-datatable](https://github.com/swimlane/ngx-datatable). 所有的ABP模块都已经实现了ngx-datatable. `ThemeSharedModule` 已经导出了 `NgxDatatableModule`. 因此如果你在终端运行 `yarn add @swimlane/ngx-datatable` 来安装这个包,它将在你的应用的所有模块中可用. + +为了正确设置样式,你需要在angular.json文件的样式部分中添加以下内容: + +```json + { + "input": "node_modules/@swimlane/ngx-datatable/index.css", + "inject": true, + "bundleName": "ngx-datatable-index" + }, + { + "input": "node_modules/@swimlane/ngx-datatable/assets/icons.css", + "inject": true, + "bundleName": "ngx-datatable-icons" + }, + { + "input": "node_modules/@swimlane/ngx-datatable/themes/material.css", + "inject": true, + "bundleName": "ngx-datatable-material" + } +``` + +由于尚未删除 `abp-table`, 因此以前由ABP v2.x构建的模块不会突然丢失所有. 但是它们的外观与内置ABP v3模块有所不同, 因此你可能希望将这些模块中的表转换为ngx-datatable. 为了减少将abp-table转换为ngx-datatable所需的工作量,我们修改了 `ListService` 以使其与 `ngx-datatable` 一起很好地工作,并引入了两个新指令: `NgxDatatableListDirective` 和 `NgxDatatableDefaultDirective`. + +这些指令的用法很简单: + +```js +@Component({ + providers: [ListService], +}) +export class SomeComponent { + data$ = this.list.hookToQuery( + query => this.dataService.get(query) + ); + + constructor( + public readonly list: ListService, + public readonly dataService: SomeDataService, + ) {} +} +``` + +...在组件模板... + +```html + + + +``` + +通过 `NgxDatatableListDirective` 绑定注入的 `ListService` 实例后,你不再需要担心分页或排序. 同样 `NgxDatatableDefaultDirective` 去除了几个属性绑定,以使ngx-datatable适合我们的样式. + +#### 一个更好的例子 + +```html + + + + + + + + + + + + + + +

{%{{{ row.someOtherProp }}}%}
+
+ + +``` + +#### 如何迁移? + +- 安装 `@swimlane/ngx-datatable` 包. +- 添加ngx-datatable样式到angular.json文件. +- 如果可以的话,根据上面的例子更新你的模. +- 如果你稍后需要这样做,并且打算保留abp-table一段时间,请确保根据此处描述的[破坏性更改](List-Service.md)更新分页. + +**重要说明:**abp-table没有被删除,但已被弃用并在以后的版本中删除. 请考虑切换到ngx-datatable。 + +### 过时的接口 + +某些接口早已被标记为已弃用,现在已将其删除. + +#### 如何迁移? + +请检查你是否仍在使用[Issue中列出的任何内容](https://github.com/abpframework/abp/issues/4281). + +## 下一步是什么? + +* [服务代理](Service-Proxies.md) \ No newline at end of file diff --git a/docs/zh-Hans/UI/Angular/Modifying-the-Menu.md b/docs/zh-Hans/UI/Angular/Modifying-the-Menu.md index ec3297ea78..1f4e626bd3 100644 --- a/docs/zh-Hans/UI/Angular/Modifying-the-Menu.md +++ b/docs/zh-Hans/UI/Angular/Modifying-the-Menu.md @@ -1,6 +1,5 @@ # 修改菜单 - 菜单在 @abp/ng.theme.basic包 `ApplicationLayoutComponent` 内部. 有几种修改菜单的方法,本文档介绍了这些方法. 如果你想完全替换菜单,请参考[组件替换文档]了解如何替换布局. @@ -24,7 +23,97 @@ export const environment = { ## 如何添加导航元素 -### 通过 AppRoutingModule 中的 `routes` 属性 +### 通过 `RoutesService` + +你可以通过调用 `RoutesService` 的 `add` 方法添加路由到菜单,它是一个单例的服务,在root中提供,你可以立即注入使用它. + +```js +import { RoutesService, eLayoutType } from '@abp/ng.core'; +import { Component } from '@angular/core'; + +@Component(/* component metadata */) +export class AppComponent { + constructor(routes: RoutesService) { + routes.add([ + { + path: '/your-path', + name: 'Your navigation', + order: 101, + iconClass: 'fas fa-question-circle', + requiredPolicy: 'permission key here', + layout: eLayoutType.application, + }, + { + path: '/your-path/child', + name: 'Your child navigation', + parentName: 'Your navigation', + order: 1, + requiredPolicy: 'permission key here', + }, + ]); + } +} +``` + +另一种方法是使用路由提供程序. 首先创建一个提供程序: + +```js +// route.provider.ts +import { RoutesService, eLayoutType } from '@abp/ng.core'; +import { APP_INITIALIZER } from '@angular/core'; + +export const APP_ROUTE_PROVIDER = [ + { provide: APP_INITIALIZER, useFactory: configureRoutes, deps: [RoutesService], multi: true }, +]; + +function configureRoutes(routes: RoutesService) { + return () => { + routes.add([ + { + path: '/your-path', + name: 'Your navigation', + requiredPolicy: 'permission key here', + order: 101, + iconClass: 'fas fa-question-circle', + layout: eLayoutType.application, + }, + { + path: '/your-path/child', + name: 'Your child navigation', + parentName: 'Your navigation', + requiredPolicy: 'permission key here', + order: 1, + }, + ]); + }; +} +``` + +...然后在app.module.ts ... + +```js +import { NgModule } from '@angular/core'; +import { APP_ROUTE_PROVIDER } from './route.provider'; + +@NgModule({ + providers: [APP_ROUTE_PROVIDER], + // imports, declarations, and bootstrap +}) +export class AppModule {} +``` + +下面是每个属性的工作原理: + +- `path` 是导航元素的绝对路径. +- `name` 是导航元素的label. 可以使用本地化Key和本地化对象. +- `parentName` 是菜单中父路由的 `name` 的引用,用于创建多级菜单项. +- `requiredPolicy` 是用于访问该页面的权限Key. 参阅[权限管理文档](Permission-Management.md). +- `order` 是导航元素的排序. `Administration` 的顺序是 `100`. 在排序top级别菜单项时请记得这一点. +- `iconClass` 是 `i` 标签的class, 它放在导航label的左边. +- `layout` 定义路由使用哪个布局加载. (默认: `eLayoutType.empty`). +- `invisible` 使该项在菜单中不可见. (默认: `false`). + +### 通过 `AppRoutingModule` 的 `routes` 属性 你可以通过在 `app-routing.module` 中将路由作为子属性添加到路由配置的 `data` 属性来定义路由. `@abp/ng.core` 包组织路由并将其存储在 `ConfigState` 中.`ApplicationLayoutComponent` 从存储中获取路由显示在菜单上. @@ -36,7 +125,7 @@ export const environment = { data: { routes: { name: 'Your navigation', - order: 3, + order: 101, iconClass: 'fas fa-question-circle', requiredPolicy: 'permission key here', children: [ @@ -47,100 +136,77 @@ export const environment = { requiredPolicy: 'permission key here', }, ], - } as ABP.Route, // can be imported from @abp/ng.core - } + }, + }, } ``` -- `name` 是导航元素的标签,可以传递本地化密钥或本地化对象. -- `order` 排序导航元素. -- `iconClass` 是 `i` 标签的类,在导航标签的左侧. -- `requiredPolicy` 是访问页面所需的权限key. 参阅 [权限管理文档](./Permission-Management.md) -- `children` is an array and is used for declaring child navigation elements. The child navigation element will be placed as a child route which will be available at `'/your-path/child'` based on the given `path` property. -- `children` 是一个数组,用于声明子菜单,它基于给定的 `path` 属性,路径是在`/your-path/child`. - -添加了上面描述的route属性后,导航菜单如下图所示: - -![navigation-menu-via-app-routing](./images/navigation-menu-via-app-routing.png) - -## 通过 ConfigState - -`ConfigStateService` 的 `dispatchAddRoute` 方法可以向菜单添加一个新的导航元素. - -```js -// this.config is instance of ConfigStateService - -const newRoute: ABP.Route = { - name: 'My New Page', - iconClass: 'fa fa-dashboard', - path: 'page', - invisible: false, - order: 2, - requiredPolicy: 'MyProjectName.MyNewPage', -} as Omit; - -this.config.dispatchAddRoute(newRoute); -// returns a state stream which emits after dispatch action is complete -``` - -`newRoute` 放在根级别,没有任何父路由,url将为`/path`. - -如果你想 **添加子路由, 你可以这样做:** +或者你可以这样做: ```js -// this.config is instance of ConfigStateService -// eIdentityRouteNames enum can be imported from @abp/ng.identity - -const newRoute: ABP.Route = { - parentName: eIdentityRouteNames.IdentityManagement, - name: 'My New Page', - iconClass: 'fa fa-dashboard', - path: 'page', - invisible: false, - order: 3, - requiredPolicy: 'MyProjectName.MyNewPage' -} as Omit; - -this.config.dispatchAddRoute(newRoute); -// returns a state stream which emits after dispatch action is complete +{ + path: 'your-path', + data: { + routes: [ + { + path: '/your-path', + name: 'Your navigation', + order: 101, + iconClass: 'fas fa-question-circle', + requiredPolicy: 'permission key here', + }, + { + path: '/your-path/child', + name: 'Your child navigation', + parentName: 'Your navigation', + order: 1, + requiredPolicy: 'permission key here', + }, + ] as ABP.Route[], // can be imported from @abp/ng.core + }, +} ``` -`newRoute` 做为 `eIdentityRouteNames.IdentityManagement` 的子路由添加, url 设置为 `'/identity/page'`. +第二种方法的优点是你不必绑定到父/子结构,可以使用任何喜欢的路由. -新路由看起来像这样: +如上所述添加 `routes` 属性后,导航菜单看起来像这样: -![navigation-menu-via-config-state](./images/navigation-menu-via-config-state.png) +![navigation-menu-via-app-routing](./images/navigation-menu-via-app-routing.png) -## 如何修改一个导航元素 +## 如何修补或删除导航元素 -`DispatchPatchRouteByName` 方法通过名称查找路由,并使用二个参数传递的新配置替换存储中的配置. +`RoutesService` 的 `patch` 方法通过名称查找路由,并将配置替换为第二个参数传递的新配置. `remove` 方法会找到一个路由并将其连同其子路由一起删除. ```js -// this.config is instance of ConfigStateService -// eIdentityRouteNames enum can be imported from @abp/ng.identity +// this.routes is instance of RoutesService +// eThemeSharedRouteNames enum can be imported from @abp/ng.theme.shared + +const dashboardRouteConfig: ABP.Route = { + path: '/dashboard', + name: '::Menu:Dashboard', + parentName: '::Menu:Home', + order: 1, + layout: eLayoutType.application, +}; -const newRouteConfig: Partial = { +const newHomeRouteConfig: Partial = { iconClass: 'fas fa-home', - parentName: eIdentityRouteNames.Administration, + parentName: eThemeSharedRouteNames.Administration, order: 0, - children: [ - { - name: 'Dashboard', - path: 'dashboard', - }, - ], }; -this.config.dispatchPatchRouteByName('::Menu:Home', newRouteConfig); -// returns a state stream which emits after dispatch action is complete +this.routes.add([dashboardRouteConfig]); +this.routes.patch('::Menu:Home', newHomeRouteConfig); +this.routes.remove(['Your navigation']); ``` -* 根据给定的 `parentName` 将 _Home_ 导航移动到 _Administration_ 下拉框下. -* 添加了 icon. -* 指定了顺序. -* 添加了名为 _Dashboard_ 的子路由. +- 根据给定的 `parentName` 将 _Home_ 导航移动到 _Administration_ 下拉菜单下. +- 为 _Home_ 添加了图标. +- 指定 _Home_ 的顺序为列表的第一项. +- 为 _Home_ 添加了一个名为 _Dashboard_ 的子路由. +- 删除 _Your navigation_ 与其子路由. -修改后,导航元素看起来像这样: +上述操作后,新的菜单看起来如下: ![navigation-menu-after-patching](./images/navigation-menu-after-patching.png) @@ -184,7 +250,7 @@ export class AppComponent { } ``` -上面我们在菜单添加了一个搜索输入,最终UI如下:s +上面我们在菜单添加了一个搜索输入,最终UI如下: ![navigation-menu-search-input](./images/navigation-menu-search-input.png) diff --git a/docs/zh-Hans/UI/Angular/images/table-of-packages-to-update.png b/docs/zh-Hans/UI/Angular/images/table-of-packages-to-update.png new file mode 100644 index 0000000000000000000000000000000000000000..fc492d374045e6fb522fd2e7027406655822c36d GIT binary patch literal 155495 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
tYM0R)<8lKZP7@M_UBe@0#(AIEfr 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%0A=zMslB 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 z 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 +```` + +Model: + +````csharp +public class DynamicFormsModel : PageModel +{ + [BindProperty] + public DetailedModel MyDetailedModel { get; set; } + + public List CountryList { get; set; } = new List + { + new SelectListItem { Value = "CA", Text = "Canada"}, + new SelectListItem { Value = "US", Text = "USA"}, + new SelectListItem { Value = "UK", Text = "United Kingdom"}, + new SelectListItem { Value = "RU", Text = "Russia"} + }; + + public void OnGet() + { + MyDetailedModel = new DetailedModel + { + Name = "", + Description = "Lorem ipsum dolor sit amet.", + IsActive = true, + Age = 65, + Day = DateTime.Now, + MyCarType = CarType.Coupe, + YourCarType = CarType.Sedan, + Country = "RU", + NeighborCountries = new List() { "UK", "CA" } + }; + } + + public class DetailedModel + { + [Required] + [Placeholder("Enter your name...")] + [Display(Name = "Name")] + public string Name { get; set; } + + [TextArea(Rows = 4)] + [Display(Name = "Description")] + [InputInfoText("Describe Yourself")] + public string Description { get; set; } + + [Required] + [DataType(DataType.Password)] + [Display(Name = "Password")] + public string Password { get; set; } + + [Display(Name = "Is Active")] + public bool IsActive { get; set; } + + [Required] + [Display(Name = "Age")] + public int Age { get; set; } + + [Required] + [Display(Name = "My Car Type")] + public CarType MyCarType { get; set; } + + [Required] + [AbpRadioButton(Inline = true)] + [Display(Name = "Your Car Type")] + public CarType YourCarType { get; set; } + + [DataType(DataType.Date)] + [Display(Name = "Day")] + public DateTime Day { get; set; } + + [SelectItems(nameof(CountryList))] + [Display(Name = "Country")] + public string Country { get; set; } + + [SelectItems(nameof(CountryList))] + [Display(Name = "Neighbor Countries")] + public List NeighborCountries { get; set; } + } + + public enum CarType + { + Sedan, + Hatchback, + StationWagon, + Coupe + } +} +```` + +## Demo + +参阅 [动态表单demo页面](https://bootstrap-taghelpers.abp.io/Components/Dropdowns)查看示例. + +## Attributes + +### abp-model + +为动态表单设置c#模型,模型的属性以表单形式转化为输入. + +### submit-button + +可以为 `True` 或 `False`. + +如果为 `True`,则会在表单底部生成一个提交按钮. + +默认值是 `False`. + +### required-symbols + +可以为 `True` 或 `False`. + +如果为 `True`,则必需的输入将带有一个符号(*),表示它们是必需的. + +默认值是 `True`. + +## 表单内容布局 + +默认情况下,“`abp-dynamic-form` 会清除内部html并将inputs放入自身. 如果要向动态表单添加其他内容或将inputs放置到某些特定区域,可以使用``标签. 这个标签将被表单内容替换, 而 `abp-dynamic-form` 标签的内部html的其余部分将保持不变. + +用法: + +````xml + +
+ Some content.... +
+
+ +
+
+ Some more content.... +
+
+```` + +## 输入排序 + +`abp-dynamic-form` 通过 `DisplayOrder` attribute对属性进行排序,然后按模型类中的属性顺序进行排序. + +默认每个属性的 `DisplayOrder` attribute值是10000. + +参见以下示例: + +````csharp +public class OrderExampleModel +{ + [DisplayOrder(10004)] + public string Name{ get; set; } + + [DisplayOrder(10005)] + public string Surname{ get; set; } + + //Default 10000 + public string EmailAddress { get; set; } + + [DisplayOrder(10003)] + public string PhoneNumber { get; set; } + + [DisplayOrder(9999)] + public string City { get; set; } +} +```` + +在这个示例中,inputs字段顺序为: `City` > `EmailAddress` > `PhoneNumber` > `Name` > `Surname`. + +## 忽略属性 + +默认情况下, `abp-dynamic-form` 会为模型类中的每个属性生成输入. 如果要忽略属性请使用 `DynamicFormIgnore` attribute. + +参见以下示例: + +````csharp +public class MyModel +{ + public string Name { get; set; } + + [DynamicFormIgnore] + public string Surname { get; set; } +} +```` + +在这个示例中,不会为 `Surname` 属性生成输入. + +## 指示文本框,单选按钮组和组合框 + +如果你已经阅读了[表单元素文档](Form-elements.md),你会注意到在c#模型上 `abp-radio` 和 `abp-select` 标签非常相. 我们必须使用 `[AbpRadioButton()]` attribute来告诉 `abp-dynamic-form` 你的哪些属性是单选按钮组,哪些属性是组合框. + +参见以下示例: + +````xml + +```` + +Model: + +````csharp +public class DynamicFormsModel : PageModel +{ + [BindProperty] + public DetailedModel MyDetailedModel { get; set; } + + public List CountryList { get; set; } = new List + { + new SelectListItem { Value = "CA", Text = "Canada"}, + new SelectListItem { Value = "US", Text = "USA"}, + new SelectListItem { Value = "UK", Text = "United Kingdom"}, + new SelectListItem { Value = "RU", Text = "Russia"} + }; + + public void OnGet() + { + MyDetailedModel = new DetailedModel + { + ComboCarType = CarType.Coupe, + RadioCarType = CarType.Sedan, + ComboCountry = "RU", + RadioCountry = "UK" + }; + } + + public class DetailedModel + { + public CarType ComboCarType { get; set; } + + [AbpRadioButton(Inline = true)] + public CarType RadioCarType { get; set; } + + [SelectItems(nameof(CountryList))] + public string ComboCountry { get; set; } + + [AbpRadioButton()] + [SelectItems(nameof(CountryList))] + public string RadioCountry { get; set; } + } + + public enum CarType + { + Sedan, + Hatchback, + StationWagon, + Coupe + } +} +```` + +正如你上面的例子中看到: + +* 如果在**Enum**属性上使用 `[AbpRadioButton()]`,它将是一个单选按钮组. 否则它是组合框. +* 如果在属性上使用 `[SelectItems()]` 和 `[AbpRadioButton()]`,那么它将是一个单选按钮组. +* 如果只在属性上使用 `[SelectItems()]`,它将是一个组合框. +* 如果一个属性没有使用这些属性,它将是一个文本框. + +## 本地化 + +`abp-dynamic-form` 会处理本地化. + +默认情况下, 它将尝试查找 "DisplayName:{PropertyName}" 或 "{PropertyName}" 定位本地化键,并将定位值设置为label. + +你可以使用Asp.Net Core的 `[Display()]` attribute自行设置. 可以在此属性中使用本地化密钥. 请参阅以下示例: + +````csharp +[Display(Name = "Name")] +public string Name { get; set; } +```` \ No newline at end of file diff --git a/docs/zh-Hans/Unit-Of-Work.md b/docs/zh-Hans/Unit-Of-Work.md index 233467250b..0fbf5762f0 100644 --- a/docs/zh-Hans/Unit-Of-Work.md +++ b/docs/zh-Hans/Unit-Of-Work.md @@ -325,7 +325,7 @@ public async Task CreateAsync(string name) 如果你的目的只是在创建/更新/删除实体后保存更改,建议你使用 `autoSave` 选项,而不是手动使用 `CurrentUnitOfWork.SaveChangesAsync()`. -> **Note-1**: 当工作单元结束而没有任何错误时,所有更改都会自动保存. 所以除非确实需要,否则不要调用 `SaveChangesAsync()`. +> **Note-1**: 当工作单元结束而没有任何错误时,所有更改都会自动保存. 所以除非确实需要,否则不要调用 `SaveChangesAsync()` 和设置 `autoSave` 为 `true`. > > **Note-2**: 如果你使用 `Guid` 作为主键,则无需插入时保存来获取生成的id,因为 `Guid` 主键是在应用程序中设置的,创建新实体后立即可用. diff --git a/docs/zh-Hans/Virtual-File-System.md b/docs/zh-Hans/Virtual-File-System.md index 3f1e9c2236..6952c4d5da 100644 --- a/docs/zh-Hans/Virtual-File-System.md +++ b/docs/zh-Hans/Virtual-File-System.md @@ -2,109 +2,77 @@ 虚拟文件系统使得管理物理上不存在于文件系统中(磁盘)的文件成为可能. 它主要用于将(js, css, image...)文件嵌入到程序集中, 并在运行时将它们象物理文件一样使用. -### Volo.Abp.VirtualFileSystem nuget包 +## 安装 -Volo.Abp.VirtualFileSystem是虚拟文件系统的核心包. 使用程序包管理器控制台(PMC)将其安装到项目中: +> 大多数情况下你不需要手动安装这个包,因为[应用程序启动模板](Startup-Templates/Application.md)已经预先安装. -``` -Install-Package Volo.Abp.VirtualFileSystem -``` +[Volo.Abp.VirtualFileSystem](https://www.nuget.org/packages/Volo.Abp.VirtualFileSystem) 是虚拟文件系统的NuGet主页. -> 启动模板默认已经安装了此nuget包, 所以在大多数情况下你不需要手动安装它. +使用ABP CLIi添加包到你的项目: -然后你可以在module中添加 **AbpVirtualFileSystemModule** 依赖项: +* 安装[ABP CLI](https://docs.abp.io/en/abp/latest/CLI),如果你还没有安装. +* 在你想要添加 `Volo.Abp.VirtualFileSystem` 包的项目的 `.csproj` 文件目录打开命令行(终端). +* 运行 `abp add-package Volo.Abp.VirtualFileSystem` 命令. -```c# -using Volo.Abp.Modularity; -using Volo.Abp.VirtualFileSystem; +如果你想要手动安装,安装[Volo.Abp.VirtualFileSystem](https://www.nuget.org/packages/Volo.Abp.VirtualFileSystem)NuGet包到你的项目并且添加`[DependsOn(typeof(AbpVirtualFileSystemModule))]`到你项目的[ABP Module](Module-Development-Basics.md)类. -namespace MyCompany.MyProject -{ - [DependsOn(typeof(AbpVirtualFileSystemModule))] - public class MyModule : AbpModule - { - //... - } -} -``` +## 与嵌入式文件工作 -#### 注册嵌入式文件 +### 嵌入文件 -要将文件嵌入到程序集中, 首先需要把该文件标记为嵌入式资源. 最简单的方式是在 **解决方案管理器** 中选择文件, 然后找到 **"属性"** 窗口将 **"生成操作"** 设置为 **"嵌入式资源"**. +要将文件嵌入到程序集中, 首先需要把该文件标记为**嵌入式资源**. 最简单的方式是在 **解决方案管理器** 中选择文件, 然后找到 **"属性"** 窗口将 **"生成操作"** 设置为 **"嵌入式资源"**. 例如: ![build-action-embedded-resource-sample](images/build-action-embedded-resource-sample.png) 如果需要添加多个文件, 这样做会很乏味. 作为选择, 你可以直接编辑 **.csproj** 文件: -````C# - - - - -```` +如果文件名包含一些特殊字符,在项目/程序集中嵌入文件可能会导致问题. 为了克服这个限制; + +1. 将[Microsoft.Extensions.FileProviders.Embedded](https://www.nuget.org/packages/Microsoft.Extensions.FileProviders.Embedded) NuGet包添加到包含嵌入式资源的项目中. +2. 添加 `true` 到 `.csproj` 文件的 `...` 部分中. 此配置以递归方式添加项目的 **MyResources** 文件夹下的所有文件(包括将来新添加的文件). -然后需要使用 `AbpVirtualFileSystemOptions` 来配置模块, 以便将嵌入式文件注册到虚拟文件系统. 例如: +> 尽管这两个步骤是可选的,并且ABP无需这些配置即可工作,但强烈建议你这样做. -````C# -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.Modularity; -using Volo.Abp.VirtualFileSystem; +### 配置AbpVirtualFileSystemOptions -namespace MyCompany.MyProject -{ - [DependsOn(typeof(AbpVirtualFileSystemModule))] - public class MyModule : AbpModule - { - public override void ConfigureServices(ServiceConfigurationContext context) - { - Configure(options => - { - //Register all embedded files of this assembly to the virtual file system - options.FileSets.AddEmbedded("YourRootNameSpace"); - }); +使用 `AbpVirtualFileSystemOptions` [选项类](Options.md)可以在[模块](Module-Development-Basics.md)的 `ConfigureServices` 方法中将嵌入式文件注册到虚拟文件系统. - //... - } - } -} -```` - -`AddEmbedded` 扩展方法需要一个类, 从给定类的程序集中查找所有嵌入文件, 并将它们注册到虚拟文件系统. 它还有更简洁的写法: +**示例: 添加嵌入式文件到虚拟文件系统** -````C# -options.FileSets.Add(new EmbeddedFileSet(typeof(MyModule).Assembly), "YourRootNameSpace"); +````csharp +Configure(options => +{ + options.FileSets.AddEmbedded(); +}); ```` -> "YourRootNameSpace" 是项目的根命名空间名字. 如果你的项目的根命名空间名字为空,则无需传递此参数. +`AddEmbedded` 扩展方法需要一个类, 从给定**类的程序集中查找所有嵌入文件**, 并将它们注册到虚拟文件系统. 通常将模块类作为通用参数传递. -#### 获取虚拟文件: IVirtualFileProvider +`AddEmbedded` 有两个可选参数; -将文件嵌入到程序集中并注册到虚拟文件系统后, 可以使用`IVirtualFileProvider`来获取文件或目录内容: +* `baseNamespace`: 仅在你没有配置上面说明的 `GenerateEmbeddedFilesManifest` 并且你的根名称空间不为空时,才可能需要这样做. 在这种情况下,请在此处设置你的根名称空间. +* `baseFolder`: 如果你不想公开项目中的所有嵌入式文件,只希望公开特定的文件夹(和子文件夹/文件),可以相对于项目根页面设置基本文件夹. -````C# -public class MyService -{ - private readonly IVirtualFileProvider _virtualFileProvider; +**示例: 添加项目中 `MyFiles` 目录下的文件** - public MyService(IVirtualFileProvider virtualFileProvider) - { - _virtualFileProvider = virtualFileProvider; - } +````csharp +Configure(options => +{ + options.FileSets.AddEmbedded( + baseNamespace: "Acme.BookStore.MyFiles", + baseFolder: "/MyFiles" + ); +}); +```` - public void Foo() - { - //Getting a single file - var file = _virtualFileProvider.GetFileInfo("/MyResources/js/test.js"); - var fileContent = file.ReadAsString(); //ReadAsString is an extension method of ABP +这个例子假设; - //Getting all files/directories under a directory - var directoryContents = _virtualFileProvider.GetDirectoryContents("/MyResources/js"); - } -} -```` +* 你的项目根(default)命令空间是 `Acme.BookStore`. +* 你的项目有一个名为 `MyFiles` 的目录. +* 你只想添加 `MyFiles` 目录到虚拟文件系统. #### 在开发过程中处理嵌入式文件 @@ -128,27 +96,61 @@ public class MyWebAppModule : AbpModule { Configure(options => { - //ReplaceEmbeddedByPhysical gets the root folder of the MyModule project options.FileSets.ReplaceEmbeddedByPhysical( - Path.Combine(hostingEnvironment.ContentRootPath, "..\\MyModuleProject") + Path.Combine( + hostingEnvironment.ContentRootPath, + string.Format( + "..{0}MyModuleProject", + Path.DirectorySeparatorChar + ) + ) ); }); } - - //... } } ```` 上面的代码假设`MyWebAppModule`和`MyModule`是Visual Studio解决方案中的两个不同的项目, `MyWebAppModule`依赖于`MyModule`. +> [应用程序启动模板]已经为本地化文件应用这个方法,所以当你更改一个本地化文件时,它会自动检测到更改. + +## IVirtualFileProvider + +将文件嵌入到程序集中并注册到虚拟文件系统后,可以使用 `IVirtualFileProvider` 接口来获取文件或目录内容: + +````C# +public class MyService +{ + private readonly IVirtualFileProvider _virtualFileProvider; + + public MyService(IVirtualFileProvider virtualFileProvider) + { + _virtualFileProvider = virtualFileProvider; + } + + public void Foo() + { + //Getting a single file + var file = _virtualFileProvider + .GetFileInfo("/MyResources/js/test.js"); + + var fileContent = file.ReadAsString(); + + //Getting all files/directories under a directory + var directoryContents = _virtualFileProvider + .GetDirectoryContents("/MyResources/js"); + } +} +```` + ### ASP.NET Core 集成 虚拟文件系统与 ASP.NET Core 无缝集成: * 虚拟文件可以像Web应用程序上的物理(静态)文件一样使用. * Js, css, 图像文件和所有其他Web内容可以嵌入到程序集中并像物理文件一样使用. -* 应用程序(或其他模块)可以覆盖模块的虚拟文件, 就像将具有相同名称和扩展名的文件放入虚拟文件的同一文件夹中一样. +* 应用程序(或其他模块)可以**覆盖模块的虚拟文件**, 就像将具有相同名称和扩展名的文件放入虚拟文件的同一文件夹中一样. #### 虚拟文件中间件 @@ -160,4 +162,14 @@ app.UseVirtualFiles(); 在静态文件中间件之后添加虚拟文件中间件, 使得通过在虚拟文件相同的位置放置物理文件, 从而用物理文件覆盖虚拟文件成为可能. -> 虚拟文件中间件可以虚拟wwwroot文件夹中的内容 - 就像静态文件一样. +> [应用程序启动模板](Startup-Templates/Application.md)已经配置了 `UseVirtualFiles()`. + +#### 静态虚拟文件夹 + +默认情况下,ASP.NET Core仅允许 `wwwroot` 文件夹包含客户端使用的静态文件. 当你使用 `UseVirtualFiles` 中间件时以下文件夹也可以包含静态文件: + +* Pages +* Views +* Themes + +这允许你可以在 `.cshtml` 文件附近添加 `.js`, `.css`... 文件,更易于开发和维护你的项目. diff --git a/docs/zh-Hans/docs-nav.json b/docs/zh-Hans/docs-nav.json index 04da437b7b..66229da6da 100644 --- a/docs/zh-Hans/docs-nav.json +++ b/docs/zh-Hans/docs-nav.json @@ -368,6 +368,10 @@ { "text": "Angular", "items": [ + { + "text": "v2.x 到 v3 迁移指南", + "path": "UI/Angular/Migration-Guide-v3.md" + }, { "text": "服务代理", "path": "UI/Angular/Service-Proxies.md" From 86f7320f7bc6a1b08433fc12c2f33cc6db547f97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 1 Jul 2020 09:28:42 +0300 Subject: [PATCH 187/190] rename OU doc. --- docs/en/Modules/Index.md | 2 +- .../{OrganizationUnit-Management.md => Organization-Units.md} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename docs/en/Modules/{OrganizationUnit-Management.md => Organization-Units.md} (100%) diff --git a/docs/en/Modules/Index.md b/docs/en/Modules/Index.md index 82464cd580..97581a39af 100644 --- a/docs/en/Modules/Index.md +++ b/docs/en/Modules/Index.md @@ -17,7 +17,7 @@ There are some **free and open source** application modules developed and mainta * **Blogging**: Used to create fancy blogs. ABP's [own blog](https://blog.abp.io/) already using this module. * [**Docs**](Docs.md): Used to create technical documentation pages. ABP's [own documentation](https://docs.abp.io) already using this module. * **Feature Management**: Used to persist and manage the [features](../Features.md). -* **Identity**: Manages [organization units](OrganizationUnit-Management.md), roles, users and their permissions, based on the Microsoft Identity library. +* **Identity**: Manages [organization units](Organization-Units.md), roles, users and their permissions, based on the Microsoft Identity library. * **IdentityServer**: Integrates to IdentityServer4. * **Permission Management**: Used to persist permissions. * **[Setting Management](Setting-Management.md)**: Used to persist and manage the [settings](../Settings.md). diff --git a/docs/en/Modules/OrganizationUnit-Management.md b/docs/en/Modules/Organization-Units.md similarity index 100% rename from docs/en/Modules/OrganizationUnit-Management.md rename to docs/en/Modules/Organization-Units.md From 51e7c2b4ee6d245fbf78ed47e7c078ce19c60863 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 1 Jul 2020 09:29:53 +0300 Subject: [PATCH 188/190] Change links for the identity --- docs/en/Modules/Identity.md | 2 ++ docs/en/Modules/Index.md | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/en/Modules/Identity.md b/docs/en/Modules/Identity.md index 028144c624..b950658505 100644 --- a/docs/en/Modules/Identity.md +++ b/docs/en/Modules/Identity.md @@ -1,4 +1,6 @@ # Identity Management Module +Identity module is used to manage [organization units](Organization-Units.md), roles, users and their permissions, based on the Microsoft Identity library. + See [the source code](https://github.com/abpframework/abp/tree/dev/modules/identity). Documentation will come soon... diff --git a/docs/en/Modules/Index.md b/docs/en/Modules/Index.md index 97581a39af..ae17c15c8a 100644 --- a/docs/en/Modules/Index.md +++ b/docs/en/Modules/Index.md @@ -17,7 +17,7 @@ There are some **free and open source** application modules developed and mainta * **Blogging**: Used to create fancy blogs. ABP's [own blog](https://blog.abp.io/) already using this module. * [**Docs**](Docs.md): Used to create technical documentation pages. ABP's [own documentation](https://docs.abp.io) already using this module. * **Feature Management**: Used to persist and manage the [features](../Features.md). -* **Identity**: Manages [organization units](Organization-Units.md), roles, users and their permissions, based on the Microsoft Identity library. +* **[Identity](Identity.md)**: Manages organization units, roles, users and their permissions, based on the Microsoft Identity library. * **IdentityServer**: Integrates to IdentityServer4. * **Permission Management**: Used to persist permissions. * **[Setting Management](Setting-Management.md)**: Used to persist and manage the [settings](../Settings.md). From 34f7d8bb65f125aef454e5ae433251c43f314d13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 1 Jul 2020 09:34:05 +0300 Subject: [PATCH 189/190] Update Organization-Units.md --- docs/en/Modules/Organization-Units.md | 83 +-------------------------- 1 file changed, 3 insertions(+), 80 deletions(-) diff --git a/docs/en/Modules/Organization-Units.md b/docs/en/Modules/Organization-Units.md index d56c5ba6ea..b27e038528 100644 --- a/docs/en/Modules/Organization-Units.md +++ b/docs/en/Modules/Organization-Units.md @@ -11,13 +11,13 @@ An OU is represented by the **OrganizationUnit** entity. The fundamental propert - **Code**: A hierarchical string code that is unique for a tenant. - **DisplayName**: Shown name of the OU. -The OrganizationUnit entity's primary key (Id) is a **Guid** type and it derives from the [**FullAuditedAggregateRoot**](../Entities.md#aggregateroot-class) class which provides audit information with **IsDeleted** property (OUs are not deleted from the database, they are just marked as deleted). +The OrganizationUnit entity's primary key (Id) is a **Guid** type and it derives from the [**FullAuditedAggregateRoot**](../Entities.md) class. #### Organization Tree Since an OU can have a parent, all OUs of a tenant are in a **tree** structure. There are some rules for this tree; -- There can be more than one root (where the ParentId is null). +- There can be more than one root (where the `ParentId` is `null`). - There is a limit for the first-level children count of an OU (because of the fixed OU Code unit length explained below). #### OU Code @@ -44,81 +44,4 @@ The **OrganizationUnitManager** class can be [injected](../Dependency-Injection. #### Multi-Tenancy -The OrganizationUnitManager is designed to work for a **single tenant** at a time. It works for the **current tenant** by default. - -### Common Use Cases - -There are some common use cases for OUs. You can find the source code of the samples [here](https://github.com/abpframework/abp-samples/tree/master/OrganizationUnitSample). - -#### Creating An Entity That Belongs To An Organization Unit - -The most obvious usage of OUs is to assign an entity to an OU. Sample entity: - -```csharp -public class Product : AuditedAggregateRoot, IMultiTenant -{ - public virtual Guid OrganizationUnitId { get; private set; } - public virtual Guid? TenantId { get; } - public virtual string Name { get; private set; } - public virtual float Price { get; private set; } -} -``` - -You need to create **OrganizationUnitId** property to assign this entity to an OU. Depending on requirement, this property can be nullable. You can now relate a Product to an OU and query the products of a specific OU. - -You can use **IMultiTenant** interface if you want to distinguish products of different tenants in a multi-tenant application (see the [Multi-Tenancy document](https://aspnetboilerplate.com/Pages/Documents/Multi-Tenancy#data-filters) for more info). If your application is not multi-tenant, you don't need this interface and property. - -#### Getting Entities In An Organization Unit - -To get the Products of an OU, you can implement a simple domain service; [Product Manager](https://github.com/abpframework/abp-samples/blob/master/OrganizationUnitSample/src/OrganizationUnitSample.Domain/Products/ProductManager.cs) in this case to get the filtered data: - -```csharp -public class ProductManager : IDomainService -{ - private readonly IProductRepository _productRepository; - - public ProductManager(IProductRepository productRepository) - { - _productRepository = productRepository; - } - - public List GetProductsInOu(OrganizationUnit organizationUnit) - { - return (await _productRepository.GetListAsync()).Where(q => q.OrganizationUnitId == organizationUnit.Id).ToList(); - } -} -``` - -**For better practice**, you should consider querying it on domain layer for performance and scalability. To do so, add a method to your repository interface: - -```csharp -public interface IProductRepository : IRepository -{ - public Task> GetProductsOfOrganizationUnitAsync(Guid organizationUnitId); -} -``` - -Then implement it on your ORM layer (which is EntityFrameworkCore in this [sample](https://github.com/abpframework/abp-samples/blob/master/OrganizationUnitSample/src/OrganizationUnitSample.EntityFrameworkCore/Products/ProductRepository.cs)): - -```csharp -public Task> GetProductsOfOrganizationUnitAsync(Guid organizationUnitId) -{ - return DbSet.Where(p => p.OrganizationUnitId == organizationUnitId).ToListAsync(); -} -``` - -Afterwards, you can modify your domain service like below: - -```csharp -public List GetProductsInOu(OrganizationUnit organizationUnit) -{ - return await _productRepository.GetProductsOfOrganizationUnitAsync(organizationUnit.Id); -} -``` - -### Settings - -You can find **MaxUserMembershipCount** settings under SettingManagement: - -- **MaxUserMembershipCount**: Maximum allowed membership count for a user. - Default value is **int.MaxValue** which allows a user to be a member of unlimited OUs at the same time. \ No newline at end of file +The `OrganizationUnitManager` is designed to work for a **single tenant** at a time. It works for the **current tenant** by default. From 4c4f909bc2f48cd77374e81374cc8ac8bcbdaea3 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Wed, 1 Jul 2020 09:52:19 +0300 Subject: [PATCH 190/190] Update new.js resolves https://github.com/abpframework/abp/issues/4183 --- .../blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/new.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/new.js b/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/new.js index f5686e64e6..5e5c38d895 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/new.js +++ b/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/new.js @@ -94,7 +94,7 @@ var validationResult = $form.validate(); abp.message.warn(validationResult.errorList[0].message); //TODO: errors can be merged into lines. make sweetalert accept HTML. e.preventDefault(); - return false; //for old browsers + return false; //for old browsers } $submitButton.buttonBusy(); @@ -122,6 +122,7 @@ title = title.replace('& ', ' '); title = title.replace('&', ''); title = title.replace(' ', '-'); + title = title.replace('/', '-'); title = title.replace(new RegExp(' ', 'g'), '-'); reflectedChange = true; $url.val(title); @@ -134,4 +135,4 @@ } }); -}); \ No newline at end of file +});