From d50f9a72c575b28b9240a6360811d852f2e928db Mon Sep 17 00:00:00 2001 From: EngincanV Date: Mon, 24 Aug 2020 14:21:09 +0300 Subject: [PATCH 001/116] Rating widget created --- .../CmsKitPublicWidgetsController.cs | 6 ++++ .../Shared/Components/Rating/Default.cshtml | 27 ++++++++++++++ .../Rating/RatingScriptBundleContributor.cs | 13 +++++++ .../Rating/RatingStyleBundleContributor.cs | 13 +++++++ .../Components/Rating/RatingViewComponent.cs | 20 +++++++++++ .../Shared/Components/Rating/default.css | 35 +++++++++++++++++++ .../Shared/Components/Rating/default.js | 1 + .../Volo.CmsKit.Public.Web.csproj | 4 +++ 8 files changed, 119 insertions(+) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingScriptBundleContributor.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingStyleBundleContributor.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.css create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Controllers/CmsKitPublicWidgetsController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Controllers/CmsKitPublicWidgetsController.cs index c130ebefca..7cc9c410c4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Controllers/CmsKitPublicWidgetsController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Controllers/CmsKitPublicWidgetsController.cs @@ -1,6 +1,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Commenting; +using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating; using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.ReactionSelection; namespace Volo.CmsKit.Public.Web.Controllers @@ -16,5 +17,10 @@ namespace Volo.CmsKit.Public.Web.Controllers { return Task.FromResult((IActionResult)ViewComponent(typeof(CommentingViewComponent), new {entityType, entityId})); } + + public Task Rating() + { + return Task.FromResult((IActionResult) ViewComponent(typeof(RatingViewComponent))); + } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml new file mode 100644 index 0000000000..f9cd651ff1 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml @@ -0,0 +1,27 @@ +@using Volo.Abp.Users +@inject ICurrentUser CurrentUser + +@if (CurrentUser.IsAuthenticated) +{ +
+

My Simple Widget

+

This is a simple widget!

+
+} + +
+ + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingScriptBundleContributor.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingScriptBundleContributor.cs new file mode 100644 index 0000000000..a57ff8294f --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingScriptBundleContributor.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; + +namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating +{ + public class RatingScriptBundleContributor : BundleContributor + { + public override void ConfigureBundle(BundleConfigurationContext context) + { + context.Files.AddIfNotContains("/Pages/CmsKit/Shared/Components/Rating/default.js"); + } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingStyleBundleContributor.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingStyleBundleContributor.cs new file mode 100644 index 0000000000..dc82f1f5da --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingStyleBundleContributor.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; + +namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating +{ + public class RatingStyleBundleContributor : BundleContributor + { + public override void ConfigureBundle(BundleConfigurationContext context) + { + context.Files.AddIfNotContains("/Pages/CmsKit/Shared/Components/Rating/default.css"); + } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs new file mode 100644 index 0000000000..f77759ac20 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs @@ -0,0 +1,20 @@ +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.UI.Widgets; + +namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating +{ + [ViewComponent(Name = "CmsRating")] + [Widget( + StyleTypes = new[] {typeof(RatingStyleBundleContributor)}, + ScriptTypes = new[] {typeof(RatingScriptBundleContributor)}, + RefreshUrl = "/CmsKitPublicWidgets/Rating" + )] + public class RatingViewComponent : AbpViewComponent + { + public IViewComponentResult Invoke() + { + return View("~/Pages/CmsKit/Shared/Components/Rating/Default.cshtml"); + } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.css b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.css new file mode 100644 index 0000000000..0dc4780ee9 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.css @@ -0,0 +1,35 @@ +.rate { + float: left; + height: 46px; + padding: 0 10px; +} +.rate:not(:checked) > input { + position:absolute; + top:-9999px; +} +.rate:not(:checked) > label { + float:right; + width:1em; + overflow:hidden; + white-space:nowrap; + cursor:pointer; + font-size:30px; + color:#ccc; +} +.rate:not(:checked) > label:before { + content: '★ '; +} +.rate > input:checked ~ label { + color: #ffc700; +} +.rate:not(:checked) > label:hover, +.rate:not(:checked) > label:hover ~ label { + color: #deb217; +} +.rate > input:checked + label:hover, +.rate > input:checked + label:hover ~ label, +.rate > input:checked ~ label:hover, +.rate > input:checked ~ label:hover ~ label, +.rate > label:hover ~ input:checked ~ label { + color: #c59b08; +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js new file mode 100644 index 0000000000..5f282702bb --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj index 6d2f8ff303..3d52f544e0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj @@ -27,6 +27,10 @@ + + true + PreserveNewest + From 12011ffe03e12f0508c75c1a2122a22473894640 Mon Sep 17 00:00:00 2001 From: EngincanV Date: Tue, 25 Aug 2020 11:39:43 +0300 Subject: [PATCH 002/116] CmsKit: Created CmsRating --- .../20200825083332_Rating_Added.Designer.cs | 1220 +++++++++ .../Migrations/20200825083332_Rating_Added.cs | 31 + .../UnifiedDbContextModelSnapshot.cs | 2414 +++++++++-------- .../GlobalFeatures/GlobalCmsKitFeatures.cs | 3 + .../CmsKit/GlobalFeatures/RatingsFeature.cs | 18 + .../Volo/CmsKit/Ratings/IRatingRepository.cs | 10 + .../Volo/CmsKit/Ratings/Rating.cs | 32 + .../CmsKitDbContextModelCreatingExtensions.cs | 13 + .../CmsKitEntityFrameworkCoreModule.cs | 2 + .../CmsKit/Ratings/EfCoreRatingRepository.cs | 14 + 10 files changed, 2561 insertions(+), 1196 deletions(-) create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825083332_Rating_Added.Designer.cs create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825083332_Rating_Added.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/RatingsFeature.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/IRatingRepository.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825083332_Rating_Added.Designer.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825083332_Rating_Added.Designer.cs new file mode 100644 index 0000000000..8a69c9cb89 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825083332_Rating_Added.Designer.cs @@ -0,0 +1,1220 @@ +// +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.EntityFrameworkCore; +using Volo.CmsKit.EntityFrameworkCore; + +namespace Volo.CmsKit.Migrations +{ + [DbContext(typeof(UnifiedDbContext))] + [Migration("20200825083332_Rating_Added")] + partial class Rating_Added + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "3.1.6") + .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.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.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.CmsKit.Comments.Comment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnName("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreatorId") + .HasColumnName("CreatorId") + .HasColumnType("uniqueidentifier"); + + b.Property("EntityId") + .IsRequired() + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("EntityType") + .IsRequired() + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("RepliedCommentId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("Text") + .IsRequired() + .HasColumnType("nvarchar(512)") + .HasMaxLength(512); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "RepliedCommentId"); + + b.HasIndex("TenantId", "EntityType", "EntityId"); + + b.ToTable("CmsComments"); + }); + + modelBuilder.Entity("Volo.CmsKit.Ratings.Rating", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnName("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreatorId") + .HasColumnName("CreatorId") + .HasColumnType("uniqueidentifier"); + + b.Property("Star") + .HasColumnType("smallint"); + + b.HasKey("Id"); + + b.ToTable("CmsRatings"); + }); + + modelBuilder.Entity("Volo.CmsKit.Reactions.UserReaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnName("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreatorId") + .HasColumnName("CreatorId") + .HasColumnType("uniqueidentifier"); + + b.Property("EntityId") + .IsRequired() + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("EntityType") + .IsRequired() + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("ReactionName") + .IsRequired() + .HasColumnType("nvarchar(32)") + .HasMaxLength(32); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "EntityType", "EntityId", "ReactionName"); + + b.HasIndex("TenantId", "CreatorId", "EntityType", "EntityId", "ReactionName"); + + b.ToTable("CmsUserReactions"); + }); + + modelBuilder.Entity("Volo.CmsKit.Users.CmsUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp") + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); + + 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("Name") + .HasColumnName("Name") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("PhoneNumber") + .HasColumnName("PhoneNumber") + .HasColumnType("nvarchar(16)") + .HasMaxLength(16); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnName("PhoneNumberConfirmed") + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("Surname") + .HasColumnName("Surname") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserName") + .IsRequired() + .HasColumnName("UserName") + .HasColumnType("nvarchar(256)") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Email"); + + b.HasIndex("TenantId", "UserName"); + + b.ToTable("CmsUsers"); + }); + + 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.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/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825083332_Rating_Added.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825083332_Rating_Added.cs new file mode 100644 index 0000000000..e6b7a3dfb3 --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825083332_Rating_Added.cs @@ -0,0 +1,31 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Volo.CmsKit.Migrations +{ + public partial class Rating_Added : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "CmsRatings", + columns: table => new + { + Id = table.Column(nullable: false), + Star = table.Column(nullable: false), + CreationTime = table.Column(nullable: false), + CreatorId = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CmsRatings", x => x.Id); + }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "CmsRatings"); + } + } +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs index 931ed2b852..0fd87d6cc2 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs @@ -1,1196 +1,1218 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Volo.Abp.EntityFrameworkCore; -using Volo.CmsKit.EntityFrameworkCore; - -namespace Volo.CmsKit.Migrations -{ - [DbContext(typeof(UnifiedDbContext))] - partial class UnifiedDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "3.1.6") - .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.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.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.CmsKit.Comments.Comment", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("EntityId") - .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("EntityType") - .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("RepliedCommentId") - .HasColumnType("uniqueidentifier"); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("Text") - .IsRequired() - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); - - b.HasKey("Id"); - - b.HasIndex("TenantId", "RepliedCommentId"); - - b.HasIndex("TenantId", "EntityType", "EntityId"); - - b.ToTable("CmsComments"); - }); - - modelBuilder.Entity("Volo.CmsKit.Reactions.UserReaction", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); - - b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); - - b.Property("EntityId") - .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("EntityType") - .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("ReactionName") - .IsRequired() - .HasColumnType("nvarchar(32)") - .HasMaxLength(32); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.HasIndex("TenantId", "EntityType", "EntityId", "ReactionName"); - - b.HasIndex("TenantId", "CreatorId", "EntityType", "EntityId", "ReactionName"); - - b.ToTable("CmsUserReactions"); - }); - - modelBuilder.Entity("Volo.CmsKit.Users.CmsUser", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") - .HasColumnType("nvarchar(40)") - .HasMaxLength(40); - - 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("Name") - .HasColumnName("Name") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("PhoneNumber") - .HasColumnName("PhoneNumber") - .HasColumnType("nvarchar(16)") - .HasMaxLength(16); - - b.Property("PhoneNumberConfirmed") - .ValueGeneratedOnAdd() - .HasColumnName("PhoneNumberConfirmed") - .HasColumnType("bit") - .HasDefaultValue(false); - - b.Property("Surname") - .HasColumnName("Surname") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); - - b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); - - b.Property("UserName") - .IsRequired() - .HasColumnName("UserName") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); - - b.HasKey("Id"); - - b.HasIndex("TenantId", "Email"); - - b.HasIndex("TenantId", "UserName"); - - b.ToTable("CmsUsers"); - }); - - 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.TenantManagement.TenantConnectionString", b => - { - b.HasOne("Volo.Abp.TenantManagement.Tenant", null) - .WithMany("ConnectionStrings") - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); -#pragma warning restore 612, 618 - } - } -} +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Volo.Abp.EntityFrameworkCore; +using Volo.CmsKit.EntityFrameworkCore; + +namespace Volo.CmsKit.Migrations +{ + [DbContext(typeof(UnifiedDbContext))] + partial class UnifiedDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "3.1.6") + .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.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.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.CmsKit.Comments.Comment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnName("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreatorId") + .HasColumnName("CreatorId") + .HasColumnType("uniqueidentifier"); + + b.Property("EntityId") + .IsRequired() + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("EntityType") + .IsRequired() + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("RepliedCommentId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("Text") + .IsRequired() + .HasColumnType("nvarchar(512)") + .HasMaxLength(512); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "RepliedCommentId"); + + b.HasIndex("TenantId", "EntityType", "EntityId"); + + b.ToTable("CmsComments"); + }); + + modelBuilder.Entity("Volo.CmsKit.Ratings.Rating", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnName("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreatorId") + .HasColumnName("CreatorId") + .HasColumnType("uniqueidentifier"); + + b.Property("Star") + .HasColumnType("smallint"); + + b.HasKey("Id"); + + b.ToTable("CmsRatings"); + }); + + modelBuilder.Entity("Volo.CmsKit.Reactions.UserReaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnName("CreationTime") + .HasColumnType("datetime2"); + + b.Property("CreatorId") + .HasColumnName("CreatorId") + .HasColumnType("uniqueidentifier"); + + b.Property("EntityId") + .IsRequired() + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("EntityType") + .IsRequired() + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("ReactionName") + .IsRequired() + .HasColumnType("nvarchar(32)") + .HasMaxLength(32); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "EntityType", "EntityId", "ReactionName"); + + b.HasIndex("TenantId", "CreatorId", "EntityType", "EntityId", "ReactionName"); + + b.ToTable("CmsUserReactions"); + }); + + modelBuilder.Entity("Volo.CmsKit.Users.CmsUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp") + .HasColumnType("nvarchar(40)") + .HasMaxLength(40); + + 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("Name") + .HasColumnName("Name") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("PhoneNumber") + .HasColumnName("PhoneNumber") + .HasColumnType("nvarchar(16)") + .HasMaxLength(16); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnName("PhoneNumberConfirmed") + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("Surname") + .HasColumnName("Surname") + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("TenantId") + .HasColumnName("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserName") + .IsRequired() + .HasColumnName("UserName") + .HasColumnType("nvarchar(256)") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Email"); + + b.HasIndex("TenantId", "UserName"); + + b.ToTable("CmsUsers"); + }); + + 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.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/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs index 646a91ef4f..bb7694262b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs @@ -11,11 +11,14 @@ namespace Volo.CmsKit.GlobalFeatures public CommentsFeature Comments => GetFeature(); + public RatingsFeature Ratings => GetFeature(); + public GlobalCmsKitFeatures([NotNull] GlobalFeatureManager featureManager) : base(featureManager) { AddFeature(new ReactionsFeature(this)); AddFeature(new CommentsFeature(this)); + AddFeature(new RatingsFeature(this)); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/RatingsFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/RatingsFeature.cs new file mode 100644 index 0000000000..b982d6cebb --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/RatingsFeature.cs @@ -0,0 +1,18 @@ +using JetBrains.Annotations; +using Volo.Abp.GlobalFeatures; + +namespace Volo.CmsKit.GlobalFeatures +{ + [GlobalFeatureName(Name)] + public class RatingsFeature : GlobalFeature + { + public const string Name = "CmsKit.Ratings"; + + internal RatingsFeature( + [NotNull] GlobalCmsKitFeatures cmsKit + ) : base(cmsKit) + { + + } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/IRatingRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/IRatingRepository.cs new file mode 100644 index 0000000000..a2f7c779af --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/IRatingRepository.cs @@ -0,0 +1,10 @@ +using System; +using Volo.Abp.Domain.Repositories; + +namespace Volo.CmsKit.Ratings +{ + public interface IRatingRepository : IBasicRepository + { + + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs new file mode 100644 index 0000000000..4f8cbee8b3 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs @@ -0,0 +1,32 @@ +using System; +using JetBrains.Annotations; +using Volo.Abp.Auditing; +using Volo.Abp.Domain.Entities; + +namespace Volo.CmsKit.Ratings +{ + public class Rating : BasicAggregateRoot, IHasCreationTime, IMustHaveCreator + { + public virtual short Star { get; protected set; } + + public virtual DateTime CreationTime { get; set; } + + public virtual Guid CreatorId { get; set; } + + protected Rating() + { + + } + + public Rating( + Guid id, + [NotNull] short star, + Guid creatorId + ) + : base(id) + { + Star = star; + CreatorId = creatorId; + } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs index a26b22883e..5c9ef3f7fd 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs @@ -8,6 +8,7 @@ using Volo.CmsKit.Reactions; using Volo.CmsKit.Users; using Volo.Abp.Users.EntityFrameworkCore; using Volo.CmsKit.GlobalFeatures; +using Volo.CmsKit.Ratings; namespace Volo.CmsKit.EntityFrameworkCore { @@ -71,6 +72,18 @@ namespace Volo.CmsKit.EntityFrameworkCore b.HasIndex(x => new { x.TenantId, x.RepliedCommentId }); }); } + + if (GlobalFeatureManager.Instance.IsEnabled()) + { + builder.Entity(r => + { + r.ToTable(options.TablePrefix + "Ratings", options.Schema); + + r.ConfigureByConvention(); + + r.Property(x => x.Star).IsRequired(); + }); + } } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitEntityFrameworkCoreModule.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitEntityFrameworkCoreModule.cs index c528da7d5e..33e57cab37 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitEntityFrameworkCoreModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitEntityFrameworkCoreModule.cs @@ -3,6 +3,7 @@ using Volo.Abp.EntityFrameworkCore; using Volo.Abp.Modularity; using Volo.Abp.Users.EntityFrameworkCore; using Volo.CmsKit.Comments; +using Volo.CmsKit.Ratings; using Volo.CmsKit.Reactions; using Volo.CmsKit.Users; @@ -22,6 +23,7 @@ namespace Volo.CmsKit.EntityFrameworkCore options.AddRepository(); options.AddRepository(); options.AddRepository(); + options.AddRepository(); }); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs new file mode 100644 index 0000000000..b05db8fcfb --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs @@ -0,0 +1,14 @@ +using System; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +using Volo.CmsKit.EntityFrameworkCore; + +namespace Volo.CmsKit.Ratings +{ + public class EfCoreRatingRepository : EfCoreRepository, IRatingRepository + { + public EfCoreRatingRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider) + { + } + } +} \ No newline at end of file From 6caab2e051db25e6d1716b30fdefa4d1fb5ae0b3 Mon Sep 17 00:00:00 2001 From: EngincanV Date: Tue, 25 Aug 2020 13:19:31 +0300 Subject: [PATCH 003/116] CmsKit: make property name more descriptive --- ...igner.cs => 20200825101525_CmsRatings_Added.Designer.cs} | 6 +++--- ...2_Rating_Added.cs => 20200825101525_CmsRatings_Added.cs} | 4 ++-- .../Migrations/UnifiedDbContextModelSnapshot.cs | 2 +- .../src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs | 6 +++--- .../CmsKitDbContextModelCreatingExtensions.cs | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) rename modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/{20200825083332_Rating_Added.Designer.cs => 20200825101525_CmsRatings_Added.Designer.cs} (97%) rename modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/{20200825083332_Rating_Added.cs => 20200825101525_CmsRatings_Added.cs} (84%) diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825083332_Rating_Added.Designer.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825101525_CmsRatings_Added.Designer.cs similarity index 97% rename from modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825083332_Rating_Added.Designer.cs rename to modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825101525_CmsRatings_Added.Designer.cs index 8a69c9cb89..3de5568a5a 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825083332_Rating_Added.Designer.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825101525_CmsRatings_Added.Designer.cs @@ -11,8 +11,8 @@ using Volo.CmsKit.EntityFrameworkCore; namespace Volo.CmsKit.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20200825083332_Rating_Added")] - partial class Rating_Added + [Migration("20200825101525_CmsRatings_Added")] + partial class CmsRatings_Added { protected override void BuildTargetModel(ModelBuilder modelBuilder) { @@ -973,7 +973,7 @@ namespace Volo.CmsKit.Migrations .HasColumnName("CreatorId") .HasColumnType("uniqueidentifier"); - b.Property("Star") + b.Property("StarCount") .HasColumnType("smallint"); b.HasKey("Id"); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825083332_Rating_Added.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825101525_CmsRatings_Added.cs similarity index 84% rename from modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825083332_Rating_Added.cs rename to modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825101525_CmsRatings_Added.cs index e6b7a3dfb3..02ee0c1a53 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825083332_Rating_Added.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825101525_CmsRatings_Added.cs @@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore.Migrations; namespace Volo.CmsKit.Migrations { - public partial class Rating_Added : Migration + public partial class CmsRatings_Added : Migration { protected override void Up(MigrationBuilder migrationBuilder) { @@ -12,7 +12,7 @@ namespace Volo.CmsKit.Migrations columns: table => new { Id = table.Column(nullable: false), - Star = table.Column(nullable: false), + StarCount = table.Column(nullable: false), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: false) }, diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs index 0fd87d6cc2..ebf821eeae 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs @@ -971,7 +971,7 @@ namespace Volo.CmsKit.Migrations .HasColumnName("CreatorId") .HasColumnType("uniqueidentifier"); - b.Property("Star") + b.Property("StarCount") .HasColumnType("smallint"); b.HasKey("Id"); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs index 4f8cbee8b3..9384183e7b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs @@ -7,7 +7,7 @@ namespace Volo.CmsKit.Ratings { public class Rating : BasicAggregateRoot, IHasCreationTime, IMustHaveCreator { - public virtual short Star { get; protected set; } + public virtual short StarCount { get; protected set; } public virtual DateTime CreationTime { get; set; } @@ -20,12 +20,12 @@ namespace Volo.CmsKit.Ratings public Rating( Guid id, - [NotNull] short star, + [NotNull] short starCount, Guid creatorId ) : base(id) { - Star = star; + StarCount = starCount; CreatorId = creatorId; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs index 5c9ef3f7fd..e013723d18 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs @@ -81,7 +81,7 @@ namespace Volo.CmsKit.EntityFrameworkCore r.ConfigureByConvention(); - r.Property(x => x.Star).IsRequired(); + r.Property(x => x.StarCount).IsRequired(); }); } } From 6708166e68fc2e90c25411549d4bcffbee6fa9b5 Mon Sep 17 00:00:00 2001 From: EngincanV Date: Wed, 26 Aug 2020 09:40:35 +0300 Subject: [PATCH 004/116] CmsKit: CmsRatings updated --- ...200826063729_CmsRatings_Added.Designer.cs} | 17 ++++++++++++++- ....cs => 20200826063729_CmsRatings_Added.cs} | 12 +++++++++-- .../UnifiedDbContextModelSnapshot.cs | 15 +++++++++++++ .../Volo/CmsKit/Ratings/RatingConsts.cs | 11 ++++++++++ .../Volo/CmsKit/Ratings/Rating.cs | 21 +++++++++++++++---- .../CmsKitDbContextModelCreatingExtensions.cs | 4 ++++ 6 files changed, 73 insertions(+), 7 deletions(-) rename modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/{20200825101525_CmsRatings_Added.Designer.cs => 20200826063729_CmsRatings_Added.Designer.cs} (96%) rename modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/{20200825101525_CmsRatings_Added.cs => 20200826063729_CmsRatings_Added.cs} (65%) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Ratings/RatingConsts.cs diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825101525_CmsRatings_Added.Designer.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200826063729_CmsRatings_Added.Designer.cs similarity index 96% rename from modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825101525_CmsRatings_Added.Designer.cs rename to modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200826063729_CmsRatings_Added.Designer.cs index 3de5568a5a..00e1003584 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825101525_CmsRatings_Added.Designer.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200826063729_CmsRatings_Added.Designer.cs @@ -11,7 +11,7 @@ using Volo.CmsKit.EntityFrameworkCore; namespace Volo.CmsKit.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20200825101525_CmsRatings_Added")] + [Migration("20200826063729_CmsRatings_Added")] partial class CmsRatings_Added { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -973,11 +973,26 @@ namespace Volo.CmsKit.Migrations .HasColumnName("CreatorId") .HasColumnType("uniqueidentifier"); + b.Property("EntityId") + .IsRequired() + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("EntityType") + .IsRequired() + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + b.Property("StarCount") .HasColumnType("smallint"); + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + b.HasKey("Id"); + b.HasIndex("TenantId", "EntityType", "EntityId"); + b.ToTable("CmsRatings"); }); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825101525_CmsRatings_Added.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200826063729_CmsRatings_Added.cs similarity index 65% rename from modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825101525_CmsRatings_Added.cs rename to modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200826063729_CmsRatings_Added.cs index 02ee0c1a53..d753d65865 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200825101525_CmsRatings_Added.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20200826063729_CmsRatings_Added.cs @@ -12,14 +12,22 @@ namespace Volo.CmsKit.Migrations columns: table => new { Id = table.Column(nullable: false), + TenantId = table.Column(nullable: true), + EntityType = table.Column(maxLength: 64, nullable: false), + EntityId = table.Column(maxLength: 64, nullable: false), StarCount = table.Column(nullable: false), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: false) + CreatorId = table.Column(nullable: false), + CreationTime = table.Column(nullable: false) }, constraints: table => { table.PrimaryKey("PK_CmsRatings", x => x.Id); }); + + migrationBuilder.CreateIndex( + name: "IX_CmsRatings_TenantId_EntityType_EntityId", + table: "CmsRatings", + columns: new[] { "TenantId", "EntityType", "EntityId" }); } protected override void Down(MigrationBuilder migrationBuilder) diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs index ebf821eeae..43d834479a 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs @@ -971,11 +971,26 @@ namespace Volo.CmsKit.Migrations .HasColumnName("CreatorId") .HasColumnType("uniqueidentifier"); + b.Property("EntityId") + .IsRequired() + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + + b.Property("EntityType") + .IsRequired() + .HasColumnType("nvarchar(64)") + .HasMaxLength(64); + b.Property("StarCount") .HasColumnType("smallint"); + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + b.HasKey("Id"); + b.HasIndex("TenantId", "EntityType", "EntityId"); + b.ToTable("CmsRatings"); }); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Ratings/RatingConsts.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Ratings/RatingConsts.cs new file mode 100644 index 0000000000..892b3cef45 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Ratings/RatingConsts.cs @@ -0,0 +1,11 @@ +using Volo.CmsKit.Entities; + +namespace Volo.CmsKit.Ratings +{ + public static class RatingConsts + { + public static int MaxEntityTypeLength { get; set; } = CmsEntityConsts.MaxEntityTypeLength; + + public static int MaxEntityIdLength { get; set; } = CmsEntityConsts.MaxEntityIdLength; + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs index 9384183e7b..a35fd022bf 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs @@ -1,5 +1,6 @@ using System; using JetBrains.Annotations; +using Volo.Abp; using Volo.Abp.Auditing; using Volo.Abp.Domain.Entities; @@ -7,12 +8,18 @@ namespace Volo.CmsKit.Ratings { public class Rating : BasicAggregateRoot, IHasCreationTime, IMustHaveCreator { + public virtual Guid? TenantId { get; protected set; } + + public virtual string EntityType { get; protected set; } + + public virtual string EntityId { get; protected set; } + public virtual short StarCount { get; protected set; } + + public virtual Guid CreatorId { get; set; } public virtual DateTime CreationTime { get; set; } - public virtual Guid CreatorId { get; set; } - protected Rating() { @@ -20,13 +27,19 @@ namespace Volo.CmsKit.Ratings public Rating( Guid id, - [NotNull] short starCount, - Guid creatorId + [NotNull] string entityType, + [NotNull] string entityId, + short starCount, + Guid creatorId, + Guid? tenantId = null ) : base(id) { + EntityType = Check.NotNullOrWhiteSpace(entityType, nameof(entityType), RatingConsts.MaxEntityTypeLength); + EntityId = Check.NotNullOrWhiteSpace(entityId, nameof(entityId), RatingConsts.MaxEntityIdLength); StarCount = starCount; CreatorId = creatorId; + TenantId = tenantId; } } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs index e013723d18..d73f60967a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs @@ -82,6 +82,10 @@ namespace Volo.CmsKit.EntityFrameworkCore r.ConfigureByConvention(); r.Property(x => x.StarCount).IsRequired(); + r.Property(x => x.EntityType).IsRequired().HasMaxLength(RatingConsts.MaxEntityTypeLength); + r.Property(x => x.EntityId).IsRequired().HasMaxLength(RatingConsts.MaxEntityIdLength); + + r.HasIndex(x => new {x.TenantId, x.EntityType, x.EntityId}); }); } } From d2458fb2ff293a8b51826390b246e56d5b2509fd Mon Sep 17 00:00:00 2001 From: EngincanV Date: Wed, 26 Aug 2020 10:54:20 +0300 Subject: [PATCH 005/116] CmsKit: Rating app service and repository implementations --- .../Volo/CmsKit/Ratings/IRatingRepository.cs | 10 ++- .../Volo/CmsKit/Ratings/Rating.cs | 14 +++- .../CmsKit/Ratings/EfCoreRatingRepository.cs | 18 ++++ .../CmsKit/MongoDB/CmsKitMongoDbContext.cs | 3 + .../MongoDB/CmsKitMongoDbContextExtensions.cs | 6 ++ .../CmsKit/MongoDB/CmsKitMongoDbModule.cs | 3 + .../CmsKit/MongoDB/ICmsKitMongoDbContext.cs | 3 + .../MongoDB/Ratings/MongoRatingRepository.cs | 31 +++++++ ...CmsKit.Public.Application.Contracts.csproj | 30 +++---- .../Public/Ratings/CreateRatingInput.cs | 10 +++ .../Public/Ratings/IRatingPublicAppService.cs | 18 ++++ .../Volo/CmsKit/Public/Ratings/RatingDto.cs | 19 +++++ .../Public/Ratings/UpdateRatingInput.cs | 10 +++ .../Volo.CmsKit.Public.Application.csproj | 32 ++++---- .../Public/Ratings/RatingPublicAppService.cs | 82 +++++++++++++++++++ 15 files changed, 256 insertions(+), 33 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Ratings/MongoRatingRepository.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/CreateRatingInput.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/IRatingPublicAppService.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/RatingDto.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/UpdateRatingInput.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Ratings/RatingPublicAppService.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/IRatingRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/IRatingRepository.cs index a2f7c779af..e7a25b1709 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/IRatingRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/IRatingRepository.cs @@ -1,10 +1,18 @@ using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using JetBrains.Annotations; using Volo.Abp.Domain.Repositories; namespace Volo.CmsKit.Ratings { public interface IRatingRepository : IBasicRepository { - + Task> GetListAsync( + [NotNull] string entityType, + [NotNull] string entityId, + CancellationToken cancellationToken = default + ); } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs index a35fd022bf..4567b5d275 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs @@ -37,9 +37,21 @@ namespace Volo.CmsKit.Ratings { EntityType = Check.NotNullOrWhiteSpace(entityType, nameof(entityType), RatingConsts.MaxEntityTypeLength); EntityId = Check.NotNullOrWhiteSpace(entityId, nameof(entityId), RatingConsts.MaxEntityIdLength); - StarCount = starCount; + SetStarCount(starCount); CreatorId = creatorId; TenantId = tenantId; } + + public virtual void SetStarCount(short starCount) + { + if(starCount <= 5 && starCount > 0) + { + StarCount = starCount; + } + else + { + throw new ArgumentOutOfRangeException("Choosen star must between 1 and 5"); + } + } } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs index b05db8fcfb..36ed50ad35 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs @@ -1,4 +1,11 @@ using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Volo.Abp; using Volo.Abp.Domain.Repositories.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore; using Volo.CmsKit.EntityFrameworkCore; @@ -10,5 +17,16 @@ namespace Volo.CmsKit.Ratings public EfCoreRatingRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider) { } + + public async Task> GetListAsync(string entityType, string entityId, CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); + Check.NotNullOrWhiteSpace(entityId, nameof(entityId)); + + var query = DbSet.Where(r => r.EntityType == entityType && r.EntityId == entityId); + var ratings = await query.ToListAsync(GetCancellationToken(cancellationToken)); + + return ratings; + } } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs index 63bf48a14e..09053167f9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs @@ -2,6 +2,7 @@ using Volo.Abp.Data; using Volo.Abp.MongoDB; using Volo.CmsKit.Comments; +using Volo.CmsKit.Ratings; using Volo.CmsKit.Reactions; using Volo.CmsKit.Users; @@ -16,6 +17,8 @@ namespace Volo.CmsKit.MongoDB public IMongoCollection CmsUsers => Collection(); + public IMongoCollection Ratings => Collection(); + protected override void CreateModel(IMongoModelBuilder modelBuilder) { base.CreateModel(modelBuilder); diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs index 568e136591..2dc4c55a71 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs @@ -2,6 +2,7 @@ using Volo.Abp; using Volo.Abp.MongoDB; using Volo.CmsKit.Comments; +using Volo.CmsKit.Ratings; using Volo.CmsKit.Reactions; using Volo.CmsKit.Users; @@ -35,6 +36,11 @@ namespace Volo.CmsKit.MongoDB { x.CollectionName = CmsKitDbProperties.DbTablePrefix + "Comments"; }); + + builder.Entity(x => + { + x.CollectionName = CmsKitDbProperties.DbTablePrefix + "Ratings"; + }); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbModule.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbModule.cs index 736b30ada1..d479821b38 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbModule.cs @@ -4,8 +4,10 @@ using Volo.Abp.MongoDB; using Volo.Abp.Users.MongoDB; using Volo.CmsKit.Comments; using Volo.CmsKit.MongoDB.Comments; +using Volo.CmsKit.MongoDB.Ratings; using Volo.CmsKit.MongoDB.Reactions; using Volo.CmsKit.MongoDB.Users; +using Volo.CmsKit.Ratings; using Volo.CmsKit.Reactions; using Volo.CmsKit.Users; @@ -25,6 +27,7 @@ namespace Volo.CmsKit.MongoDB options.AddRepository(); options.AddRepository(); options.AddRepository(); + options.AddRepository(); }); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs index 16b72c8902..40914a9720 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs @@ -2,6 +2,7 @@ using Volo.Abp.Data; using Volo.Abp.MongoDB; using Volo.CmsKit.Comments; +using Volo.CmsKit.Ratings; using Volo.CmsKit.Reactions; using Volo.CmsKit.Users; @@ -15,5 +16,7 @@ namespace Volo.CmsKit.MongoDB IMongoCollection Comments { get; } IMongoCollection CmsUsers { get; } + + IMongoCollection Ratings { get; } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Ratings/MongoRatingRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Ratings/MongoRatingRepository.cs new file mode 100644 index 0000000000..a7b5fa33b2 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Ratings/MongoRatingRepository.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using MongoDB.Driver; +using MongoDB.Driver.Linq; +using Volo.Abp; +using Volo.Abp.Domain.Repositories.MongoDB; +using Volo.Abp.MongoDB; +using Volo.CmsKit.Ratings; + +namespace Volo.CmsKit.MongoDB.Ratings +{ + public class MongoRatingRepository : MongoDbRepository, IRatingRepository + { + public MongoRatingRepository(IMongoDbContextProvider dbContextProvider) : base(dbContextProvider) + { + } + + public async Task> GetListAsync(string entityType, string entityId, CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); + Check.NotNullOrWhiteSpace(entityId, nameof(entityId)); + + var query = GetMongoQueryable().Where(r => r.EntityType == entityType && r.EntityId == entityId); + var ratings = await query.ToListAsync(GetCancellationToken(cancellationToken)); + + return ratings; + } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo.CmsKit.Public.Application.Contracts.csproj b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo.CmsKit.Public.Application.Contracts.csproj index f44c745740..8515d28e83 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo.CmsKit.Public.Application.Contracts.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo.CmsKit.Public.Application.Contracts.csproj @@ -1,15 +1,15 @@ - - - - - - - netstandard2.0 - - - - - - - - + + + + + + + netstandard2.0 + + + + + + + + diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/CreateRatingInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/CreateRatingInput.cs new file mode 100644 index 0000000000..88b53d5b0c --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/CreateRatingInput.cs @@ -0,0 +1,10 @@ +using System.ComponentModel.DataAnnotations; + +namespace Volo.CmsKit.Public.Ratings +{ + public class CreateRatingInput + { + [Required] + public short StarCount { get; set; } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/IRatingPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/IRatingPublicAppService.cs new file mode 100644 index 0000000000..d72d9dd365 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/IRatingPublicAppService.cs @@ -0,0 +1,18 @@ +using System; +using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; + +namespace Volo.CmsKit.Public.Ratings +{ + public interface IRatingPublicAppService : IApplicationService + { + Task> GetListAsync(string entityType, string entityId); + + Task CreateAsync(string entityType, string entityId, CreateRatingInput input); + + Task UpdateAsync(Guid id, UpdateRatingInput input); + + Task DeleteAsync(Guid id); + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/RatingDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/RatingDto.cs new file mode 100644 index 0000000000..bf050465c9 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/RatingDto.cs @@ -0,0 +1,19 @@ +using System; + +namespace Volo.CmsKit.Public.Ratings +{ + public class RatingDto + { + public Guid Id { get; set; } + + public string EntityType { get; set; } + + public string EntityId { get; set; } + + public short StarCount { get; set; } + + public Guid CreatorId { get; set; } + + public DateTime CreationTime { get; set; } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/UpdateRatingInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/UpdateRatingInput.cs new file mode 100644 index 0000000000..e2f77122d4 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/UpdateRatingInput.cs @@ -0,0 +1,10 @@ +using System.ComponentModel.DataAnnotations; + +namespace Volo.CmsKit.Public.Ratings +{ + public class UpdateRatingInput + { + [Required] + public short StarCount { get; set; } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo.CmsKit.Public.Application.csproj b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo.CmsKit.Public.Application.csproj index a8a9613fbf..702523e3c6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo.CmsKit.Public.Application.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo.CmsKit.Public.Application.csproj @@ -1,16 +1,16 @@ - - - - - - - netstandard2.0 - - - - - - - - - + + + + + + + netstandard2.0 + + + + + + + + + diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Ratings/RatingPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Ratings/RatingPublicAppService.cs new file mode 100644 index 0000000000..4eb5e8e9ed --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Ratings/RatingPublicAppService.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; +using Volo.Abp.Authorization; +using Volo.Abp.Users; +using Volo.CmsKit.Ratings; +using Volo.CmsKit.Users; + +namespace Volo.CmsKit.Public.Ratings +{ + public class RatingPublicAppService : ApplicationService, IRatingPublicAppService + { + protected IRatingRepository RatingRepository { get; } + public ICmsUserLookupService CmsUserLookupService { get; } + + public RatingPublicAppService(IRatingRepository ratingRepository, ICmsUserLookupService cmsUserLookupService) + { + RatingRepository = ratingRepository; + CmsUserLookupService = cmsUserLookupService; + } + + public virtual async Task> GetListAsync(string entityType, string entityId) + { + var ratings = await RatingRepository.GetListAsync(entityType, entityId); + var ratingDto = ObjectMapper.Map, List>(ratings); + + return new ListResultDto(ratingDto); + } + + [Authorize] + public virtual async Task CreateAsync(string entityType, string entityId, CreateRatingInput input) + { + var user = await CmsUserLookupService.GetByIdAsync(CurrentUser.GetId()); + + var rating = await RatingRepository.InsertAsync( + new Rating( + GuidGenerator.Create(), + entityType, + entityId, + input.StarCount, + user.Id, + CurrentTenant.Id + ) + ); + + return ObjectMapper.Map(rating); + } + + [Authorize] + public virtual async Task UpdateAsync(Guid id, UpdateRatingInput input) + { + var rating = await RatingRepository.GetAsync(id); + + if (rating.CreatorId != CurrentUser.GetId()) + { + throw new AbpAuthorizationException(); + } + + rating.SetStarCount(input.StarCount); + + var updatedRating = await RatingRepository.UpdateAsync(rating); + + return ObjectMapper.Map(updatedRating); + } + + [Authorize] + public virtual async Task DeleteAsync(Guid id) + { + var rating = await RatingRepository.GetAsync(id); + + if (rating.CreatorId != CurrentUser.GetId()) + { + throw new AbpAuthorizationException(); + } + + await RatingRepository.DeleteAsync(id); + } + } +} \ No newline at end of file From dd13fc2b17624194186fd3c970c4e905e5c4bf1a Mon Sep 17 00:00:00 2001 From: EngincanV Date: Wed, 26 Aug 2020 16:22:33 +0300 Subject: [PATCH 006/116] CmsKit: GetCurrentUserRatingAsync added --- .../Volo/CmsKit/Ratings/IRatingRepository.cs | 7 +++ .../CmsKit/Ratings/EfCoreRatingRepository.cs | 10 ++++ .../MongoDB/Ratings/MongoRatingRepository.cs | 13 ++++ .../Public/Ratings/IRatingPublicAppService.cs | 4 +- .../PublicApplicationAutoMapperProfile.cs | 4 ++ .../Public/Ratings/RatingPublicAppService.cs | 10 ++++ .../Volo.CmsKit.Public.HttpApi.csproj | 32 +++++----- .../Public/Ratings/RatingPublicController.cs | 59 +++++++++++++++++++ .../CmsKitPublicWidgetsController.cs | 4 +- .../Components/Rating/RatingViewComponent.cs | 56 +++++++++++++++++- 10 files changed, 177 insertions(+), 22 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Ratings/RatingPublicController.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/IRatingRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/IRatingRepository.cs index e7a25b1709..d889c4b678 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/IRatingRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/IRatingRepository.cs @@ -14,5 +14,12 @@ namespace Volo.CmsKit.Ratings [NotNull] string entityId, CancellationToken cancellationToken = default ); + + Task GetCurrentUserRatingAsync( + [NotNull] string entityType, + [NotNull] string entityId, + Guid userId, + CancellationToken cancellationToken = default + ); } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs index 36ed50ad35..b7e53e9b59 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs @@ -28,5 +28,15 @@ namespace Volo.CmsKit.Ratings return ratings; } + + public async Task GetCurrentUserRatingAsync(string entityType, string entityId, Guid userId, CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); + Check.NotNullOrWhiteSpace(entityId, nameof(entityId)); + + var rating = await DbSet.FirstOrDefaultAsync(r => r.EntityType == entityType && r.EntityId == entityId && r.CreatorId == userId, GetCancellationToken(cancellationToken)); + + return rating; + } } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Ratings/MongoRatingRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Ratings/MongoRatingRepository.cs index a7b5fa33b2..93509233f0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Ratings/MongoRatingRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Ratings/MongoRatingRepository.cs @@ -27,5 +27,18 @@ namespace Volo.CmsKit.MongoDB.Ratings return ratings; } + + public async Task GetCurrentUserRatingAsync(string entityType, string entityId, Guid userId, + CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); + Check.NotNullOrWhiteSpace(entityId, nameof(entityId)); + + var rating = await GetMongoQueryable() + .FirstOrDefaultAsync(r => r.EntityType == entityType && r.EntityId == entityId && r.CreatorId == userId, + GetCancellationToken(cancellationToken)); + + return rating; + } } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/IRatingPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/IRatingPublicAppService.cs index d72d9dd365..79785913bb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/IRatingPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/IRatingPublicAppService.cs @@ -8,11 +8,13 @@ namespace Volo.CmsKit.Public.Ratings public interface IRatingPublicAppService : IApplicationService { Task> GetListAsync(string entityType, string entityId); - + Task CreateAsync(string entityType, string entityId, CreateRatingInput input); Task UpdateAsync(Guid id, UpdateRatingInput input); Task DeleteAsync(Guid id); + + Task GetCurrentUserRatingAsync(string entityType, string entityId); } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs index e0b64bb0e8..3ac2d1949b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs @@ -2,6 +2,8 @@ using Volo.Abp.AutoMapper; using Volo.CmsKit.Comments; using Volo.CmsKit.Public.Comments; +using Volo.CmsKit.Public.Ratings; +using Volo.CmsKit.Ratings; using Volo.CmsKit.Users; namespace Volo.CmsKit.Public @@ -18,6 +20,8 @@ namespace Volo.CmsKit.Public CreateMap() .Ignore(x=> x.Replies) .Ignore(x=> x.Author); + + CreateMap(); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Ratings/RatingPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Ratings/RatingPublicAppService.cs index 4eb5e8e9ed..43bc6546aa 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Ratings/RatingPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Ratings/RatingPublicAppService.cs @@ -78,5 +78,15 @@ namespace Volo.CmsKit.Public.Ratings await RatingRepository.DeleteAsync(id); } + + [Authorize] + public virtual async Task GetCurrentUserRatingAsync(string entityType, string entityId) + { + var currentUserId = CurrentUser.GetId(); + + var rating = await RatingRepository.GetCurrentUserRatingAsync(entityType, entityId, currentUserId); + + return ObjectMapper.Map(rating); + } } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo.CmsKit.Public.HttpApi.csproj b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo.CmsKit.Public.HttpApi.csproj index da54b3d2bf..ec87dac00f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo.CmsKit.Public.HttpApi.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo.CmsKit.Public.HttpApi.csproj @@ -1,16 +1,16 @@ - - - - - - - netcoreapp3.1 - - - - - - - - - + + + + + + + netcoreapp3.1 + + + + + + + + + diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Ratings/RatingPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Ratings/RatingPublicController.cs new file mode 100644 index 0000000000..c6f6355e75 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Ratings/RatingPublicController.cs @@ -0,0 +1,59 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.GlobalFeatures; + +namespace Volo.CmsKit.Public.Ratings +{ + [RequiresGlobalFeature(typeof(RatingsFeature))] + [RemoteService(Name = CmsKitPublicRemoteServiceConsts.RemoteServiceName)] + [Area("cms-kit")] + [Route("api/cms-kit-public/ratings")] + public class RatingPublicController : CmsKitPublicControllerBase, IRatingPublicAppService + { + protected IRatingPublicAppService RatingPublicAppService { get; } + + public RatingPublicController(IRatingPublicAppService ratingPublicAppService) + { + RatingPublicAppService = ratingPublicAppService; + } + + [HttpGet] + [Route("{entityType}/{entityId}")] + public virtual Task> GetListAsync(string entityType, string entityId) + { + return RatingPublicAppService.GetListAsync(entityType, entityId); + } + + [HttpPut] + [Route("{entityType}/{entityId}")] + public virtual Task CreateAsync(string entityType, string entityId, CreateRatingInput input) + { + return RatingPublicAppService.CreateAsync(entityType, entityId, input); + } + + [HttpPut] + [Route("{id}")] + public virtual Task UpdateAsync(Guid id, UpdateRatingInput input) + { + return RatingPublicAppService.UpdateAsync(id, input); + } + + [HttpDelete] + [Route("{id}")] + public Task DeleteAsync(Guid id) + { + return RatingPublicAppService.DeleteAsync(id); + } + + [HttpGet] + [Route("{entityType}/{entityId}")] + public Task GetCurrentUserRatingAsync(string entityType, string entityId) + { + return RatingPublicAppService.GetCurrentUserRatingAsync(entityType, entityId); + } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Controllers/CmsKitPublicWidgetsController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Controllers/CmsKitPublicWidgetsController.cs index 7cc9c410c4..e0b1f9d6f3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Controllers/CmsKitPublicWidgetsController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Controllers/CmsKitPublicWidgetsController.cs @@ -18,9 +18,9 @@ namespace Volo.CmsKit.Public.Web.Controllers return Task.FromResult((IActionResult)ViewComponent(typeof(CommentingViewComponent), new {entityType, entityId})); } - public Task Rating() + public Task Rating(string entityType, string entityId) { - return Task.FromResult((IActionResult) ViewComponent(typeof(RatingViewComponent))); + return Task.FromResult((IActionResult) ViewComponent(typeof(RatingViewComponent), new {entityType, entityId})); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs index f77759ac20..cabae790c0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs @@ -1,6 +1,12 @@ -using Microsoft.AspNetCore.Mvc; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.UI; using Volo.Abp.AspNetCore.Mvc.UI.Widgets; +using Volo.Abp.Users; +using Volo.CmsKit.Public.Ratings; namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating { @@ -12,9 +18,53 @@ namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating )] public class RatingViewComponent : AbpViewComponent { - public IViewComponentResult Invoke() + public IRatingPublicAppService RatingPublicAppService { get; } + public AbpMvcUiOptions AbpMvcUiOptions { get; } + public ICurrentUser CurrentUser { get; } + + public RatingViewComponent(IRatingPublicAppService ratingPublicAppService, IOptions options, ICurrentUser currentUser) + { + RatingPublicAppService = ratingPublicAppService; + AbpMvcUiOptions = options.Value; + CurrentUser = currentUser; + } + + public virtual async Task InvokeAsync(string entityType, string entityId) { - return View("~/Pages/CmsKit/Shared/Components/Rating/Default.cshtml"); + var ratings = await RatingPublicAppService.GetListAsync(entityType, entityId); + + RatingDto currentUserRating = null; + if (CurrentUser.IsAuthenticated) + { + currentUserRating = await RatingPublicAppService.GetCurrentUserRatingAsync(entityType, entityId); + } + + var loginUrl = + $"{AbpMvcUiOptions.LoginUrl}?returnUrl={HttpContext.Request.Path.ToString()}&returnUrlHash=#cms-comment_{entityType}_{entityId}"; + + var viewModel = new RatingViewModel + { + EntityId = entityId, + EntityType = entityType, + LoginUrl = loginUrl, + Ratings = ratings.Items, + CurrentRating = currentUserRating + }; + + return View("~/Pages/CmsKit/Shared/Components/Rating/Default.cshtml", viewModel); } } + + public class RatingViewModel + { + public string EntityType { get; set; } + + public string EntityId { get; set; } + + public string LoginUrl { get; set; } + + public IReadOnlyList Ratings { get; set; } + + public RatingDto CurrentRating { get; set; } + } } \ No newline at end of file From 404fe5e8a014a0aae005171305ab31db7cf57b59 Mon Sep 17 00:00:00 2001 From: EngincanV Date: Thu, 27 Aug 2020 11:52:34 +0300 Subject: [PATCH 007/116] CmsKit: ratings group by star count --- .../Pages/Index.cshtml | 5 ++++ .../Volo/CmsKit/Ratings/IRatingRepository.cs | 6 +++++ .../RatingWithStarCountQueryResultItem.cs | 9 ++++++++ .../CmsKit/Ratings/EfCoreRatingRepository.cs | 21 +++++++++++++++++ .../MongoDB/Ratings/MongoRatingRepository.cs | 23 +++++++++++++++++++ .../Public/Ratings/IRatingPublicAppService.cs | 3 +++ .../Public/Ratings/RatingWithStarCountDto.cs | 9 ++++++++ .../PublicApplicationAutoMapperProfile.cs | 2 ++ .../Public/Ratings/RatingPublicAppService.cs | 7 ++++++ .../Public/Ratings/RatingPublicController.cs | 12 ++++++++-- .../Components/Rating/RatingViewComponent.cs | 6 ++--- 11 files changed, 98 insertions(+), 5 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/RatingWithStarCountQueryResultItem.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/RatingWithStarCountDto.cs diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml index 253016f03b..ab628d4412 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml @@ -5,6 +5,7 @@ @using Volo.CmsKit.GlobalFeatures @using Volo.CmsKit.Pages @using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Commenting +@using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating @using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.ReactionSelection @model IndexModel @inject IStringLocalizer Localizer @@ -57,3 +58,7 @@ } + +
+@await Component.InvokeAsync(typeof(RatingViewComponent), new { entityType = "quote", entityId = "2" }) +
diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/IRatingRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/IRatingRepository.cs index d889c4b678..29ce07df63 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/IRatingRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/IRatingRepository.cs @@ -21,5 +21,11 @@ namespace Volo.CmsKit.Ratings Guid userId, CancellationToken cancellationToken = default ); + + Task> GetGroupedStarCountsAsync( + [NotNull] string entityType, + [NotNull] string entityId, + CancellationToken cancellationToken = default + ); } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/RatingWithStarCountQueryResultItem.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/RatingWithStarCountQueryResultItem.cs new file mode 100644 index 0000000000..5f53074b97 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/RatingWithStarCountQueryResultItem.cs @@ -0,0 +1,9 @@ +namespace Volo.CmsKit.Ratings +{ + public class RatingWithStarCountQueryResultItem + { + public short StarCount { get; set; } + + public int Count { get; set; } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs index b7e53e9b59..b9f210cdcf 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs @@ -38,5 +38,26 @@ namespace Volo.CmsKit.Ratings return rating; } + + public async Task> GetGroupedStarCountsAsync(string entityType, string entityId, CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); + Check.NotNullOrWhiteSpace(entityId, nameof(entityId)); + + var query = from rating in DbSet + where rating.EntityType == entityType && rating.EntityId == entityId + orderby rating.StarCount descending + group rating by rating.StarCount + into g + select new RatingWithStarCountQueryResultItem + { + StarCount = g.Key, + Count = g.Count() + }; + + var ratings = await query.ToListAsync(GetCancellationToken(cancellationToken)); + + return ratings; + } } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Ratings/MongoRatingRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Ratings/MongoRatingRepository.cs index 93509233f0..a58b0517f4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Ratings/MongoRatingRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Ratings/MongoRatingRepository.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks; using MongoDB.Driver; @@ -40,5 +41,27 @@ namespace Volo.CmsKit.MongoDB.Ratings return rating; } + + public async Task> GetGroupedStarCountsAsync(string entityType, + string entityId, CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); + Check.NotNullOrWhiteSpace(entityId, nameof(entityId)); + + var query = from rating in GetMongoQueryable() + where rating.EntityType == entityType && rating.EntityId == entityId + orderby rating.StarCount descending + group rating by rating.StarCount + into g + select new RatingWithStarCountQueryResultItem + { + StarCount = g.Key, + Count = g.Count() + }; + + var ratings = await query.ToListAsync(GetCancellationToken(cancellationToken)); + + return ratings; + } } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/IRatingPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/IRatingPublicAppService.cs index 79785913bb..9e4c8c1f11 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/IRatingPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/IRatingPublicAppService.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Threading.Tasks; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; @@ -16,5 +17,7 @@ namespace Volo.CmsKit.Public.Ratings Task DeleteAsync(Guid id); Task GetCurrentUserRatingAsync(string entityType, string entityId); + + Task> GetGroupedStarCountsAsync(string entityType, string entityId); } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/RatingWithStarCountDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/RatingWithStarCountDto.cs new file mode 100644 index 0000000000..e8f60ea49b --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/RatingWithStarCountDto.cs @@ -0,0 +1,9 @@ +namespace Volo.CmsKit.Public.Ratings +{ + public class RatingWithStarCountDto + { + public short StarCount { get; set; } + + public int Count { get; set; } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs index 3ac2d1949b..0a0a5403b1 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs @@ -22,6 +22,8 @@ namespace Volo.CmsKit.Public .Ignore(x=> x.Author); CreateMap(); + + CreateMap(); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Ratings/RatingPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Ratings/RatingPublicAppService.cs index 43bc6546aa..7621924727 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Ratings/RatingPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Ratings/RatingPublicAppService.cs @@ -88,5 +88,12 @@ namespace Volo.CmsKit.Public.Ratings return ObjectMapper.Map(rating); } + + public virtual async Task> GetGroupedStarCountsAsync(string entityType, string entityId) + { + var ratings = await RatingRepository.GetGroupedStarCountsAsync(entityType, entityId); + + return ObjectMapper.Map, List>(ratings); + } } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Ratings/RatingPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Ratings/RatingPublicController.cs index c6f6355e75..25cc40ea5a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Ratings/RatingPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Ratings/RatingPublicController.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Volo.Abp; @@ -44,16 +45,23 @@ namespace Volo.CmsKit.Public.Ratings [HttpDelete] [Route("{id}")] - public Task DeleteAsync(Guid id) + public virtual Task DeleteAsync(Guid id) { return RatingPublicAppService.DeleteAsync(id); } [HttpGet] [Route("{entityType}/{entityId}")] - public Task GetCurrentUserRatingAsync(string entityType, string entityId) + public virtual Task GetCurrentUserRatingAsync(string entityType, string entityId) { return RatingPublicAppService.GetCurrentUserRatingAsync(entityType, entityId); } + + [HttpGet] + [Route("{entityType}/{entityId}")] + public virtual Task> GetGroupedStarCountsAsync(string entityType, string entityId) + { + return RatingPublicAppService.GetGroupedStarCountsAsync(entityType, entityId); + } } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs index cabae790c0..31dedbc532 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs @@ -31,7 +31,7 @@ namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating public virtual async Task InvokeAsync(string entityType, string entityId) { - var ratings = await RatingPublicAppService.GetListAsync(entityType, entityId); + var ratings = await RatingPublicAppService.GetGroupedStarCountsAsync(entityType, entityId); RatingDto currentUserRating = null; if (CurrentUser.IsAuthenticated) @@ -47,7 +47,7 @@ namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating EntityId = entityId, EntityType = entityType, LoginUrl = loginUrl, - Ratings = ratings.Items, + Ratings = ratings, CurrentRating = currentUserRating }; @@ -63,7 +63,7 @@ namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating public string LoginUrl { get; set; } - public IReadOnlyList Ratings { get; set; } + public List Ratings { get; set; } public RatingDto CurrentRating { get; set; } } From 3cc99ecd30058d9928a1c498eba5193daee6eed5 Mon Sep 17 00:00:00 2001 From: EngincanV Date: Thu, 27 Aug 2020 12:31:07 +0300 Subject: [PATCH 008/116] CmsKit: order by desc bugfix --- .../CmsKit/Ratings/EfCoreRatingRepository.cs | 20 ++++++++++++------- .../MongoDB/Ratings/MongoRatingRepository.cs | 15 ++++++++------ 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs index b9f210cdcf..577f2e3a7d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs @@ -18,7 +18,8 @@ namespace Volo.CmsKit.Ratings { } - public async Task> GetListAsync(string entityType, string entityId, CancellationToken cancellationToken = default) + public async Task> GetListAsync(string entityType, string entityId, + CancellationToken cancellationToken = default) { Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); Check.NotNullOrWhiteSpace(entityId, nameof(entityId)); @@ -29,31 +30,36 @@ namespace Volo.CmsKit.Ratings return ratings; } - public async Task GetCurrentUserRatingAsync(string entityType, string entityId, Guid userId, CancellationToken cancellationToken = default) + public async Task GetCurrentUserRatingAsync(string entityType, string entityId, Guid userId, + CancellationToken cancellationToken = default) { Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); Check.NotNullOrWhiteSpace(entityId, nameof(entityId)); - var rating = await DbSet.FirstOrDefaultAsync(r => r.EntityType == entityType && r.EntityId == entityId && r.CreatorId == userId, GetCancellationToken(cancellationToken)); + var rating = await DbSet.FirstOrDefaultAsync( + r => r.EntityType == entityType && r.EntityId == entityId && r.CreatorId == userId, + GetCancellationToken(cancellationToken)); return rating; } - public async Task> GetGroupedStarCountsAsync(string entityType, string entityId, CancellationToken cancellationToken = default) + public async Task> GetGroupedStarCountsAsync(string entityType, + string entityId, CancellationToken cancellationToken = default) { Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); Check.NotNullOrWhiteSpace(entityId, nameof(entityId)); - var query = from rating in DbSet + var query = ( + from rating in DbSet where rating.EntityType == entityType && rating.EntityId == entityId - orderby rating.StarCount descending group rating by rating.StarCount into g select new RatingWithStarCountQueryResultItem { StarCount = g.Key, Count = g.Count() - }; + } + ).OrderByDescending(r => r.StarCount); var ratings = await query.ToListAsync(GetCancellationToken(cancellationToken)); diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Ratings/MongoRatingRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Ratings/MongoRatingRepository.cs index a58b0517f4..ecf389cde7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Ratings/MongoRatingRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Ratings/MongoRatingRepository.cs @@ -14,11 +14,13 @@ namespace Volo.CmsKit.MongoDB.Ratings { public class MongoRatingRepository : MongoDbRepository, IRatingRepository { - public MongoRatingRepository(IMongoDbContextProvider dbContextProvider) : base(dbContextProvider) + public MongoRatingRepository(IMongoDbContextProvider dbContextProvider) : base( + dbContextProvider) { } - public async Task> GetListAsync(string entityType, string entityId, CancellationToken cancellationToken = default) + public async Task> GetListAsync(string entityType, string entityId, + CancellationToken cancellationToken = default) { Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); Check.NotNullOrWhiteSpace(entityId, nameof(entityId)); @@ -38,7 +40,7 @@ namespace Volo.CmsKit.MongoDB.Ratings var rating = await GetMongoQueryable() .FirstOrDefaultAsync(r => r.EntityType == entityType && r.EntityId == entityId && r.CreatorId == userId, GetCancellationToken(cancellationToken)); - + return rating; } @@ -48,16 +50,17 @@ namespace Volo.CmsKit.MongoDB.Ratings Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); Check.NotNullOrWhiteSpace(entityId, nameof(entityId)); - var query = from rating in GetMongoQueryable() + var query = ( + from rating in GetMongoQueryable() where rating.EntityType == entityType && rating.EntityId == entityId - orderby rating.StarCount descending group rating by rating.StarCount into g select new RatingWithStarCountQueryResultItem { StarCount = g.Key, Count = g.Count() - }; + } + ).OrderByDescending(r => r.StarCount); var ratings = await query.ToListAsync(GetCancellationToken(cancellationToken)); From a57c1b975f36b84e63df1616a47f3a6dbe962580 Mon Sep 17 00:00:00 2001 From: EngincanV Date: Thu, 27 Aug 2020 14:48:55 +0300 Subject: [PATCH 009/116] CmsKit: Rating missing tests --- .../Ratings/RatingPublicAppService_Tests.cs | 103 ++++++++++++++++++ .../Ratings/RatingRepository_Tests.cs | 9 ++ .../MongoDB/Ratings/RatingRepository_Tests.cs | 11 ++ .../CmsKitDataSeedContributor.cs | 47 +++++++- .../Ratings/RatingRepository_Tests.cs | 49 +++++++++ 5 files changed, 215 insertions(+), 4 deletions(-) create mode 100644 modules/cms-kit/test/Volo.CmsKit.Application.Tests/Ratings/RatingPublicAppService_Tests.cs create mode 100644 modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/EntityFrameworkCore/Ratings/RatingRepository_Tests.cs create mode 100644 modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/Ratings/RatingRepository_Tests.cs create mode 100644 modules/cms-kit/test/Volo.CmsKit.TestBase/Ratings/RatingRepository_Tests.cs diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Ratings/RatingPublicAppService_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Ratings/RatingPublicAppService_Tests.cs new file mode 100644 index 0000000000..1a21da8425 --- /dev/null +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Ratings/RatingPublicAppService_Tests.cs @@ -0,0 +1,103 @@ +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using NSubstitute; +using Shouldly; +using Volo.Abp.Users; +using Volo.CmsKit.Public.Ratings; +using Xunit; + +namespace Volo.CmsKit.Ratings +{ + public class RatingPublicAppService_Tests : CmsKitApplicationTestBase + { + private readonly IRatingPublicAppService _ratingAppService; + private ICurrentUser _currentUser; + private readonly CmsKitTestData _cmsKitTestData; + + public RatingPublicAppService_Tests() + { + _ratingAppService = GetRequiredService(); + _cmsKitTestData = GetRequiredService(); + } + + protected override void AfterAddApplication(IServiceCollection services) + { + _currentUser = Substitute.For(); + services.AddSingleton(_currentUser); + } + + [Fact] + public async Task CreateAsync() + { + _currentUser.Id.Returns(_cmsKitTestData.User1Id); + + var newRating = await _ratingAppService.CreateAsync( + _cmsKitTestData.EntityType1, + _cmsKitTestData.EntityId1, + new CreateRatingInput + { + StarCount = 4 + }); + + UsingDbContext(context => + { + var ratings = context.Set().Where(x => + x.EntityId == _cmsKitTestData.EntityId1 && x.EntityType == _cmsKitTestData.EntityType1).ToList(); + + ratings + .Any(c => c.Id == newRating.Id && c.CreatorId == newRating.CreatorId && c.StarCount == newRating.StarCount) + .ShouldBeTrue(); + }); + } + + [Fact] + public async Task UpdateAsync() + { + _currentUser.Id.Returns(_cmsKitTestData.User1Id); + + var rating = await _ratingAppService.CreateAsync( + _cmsKitTestData.EntityType1, + _cmsKitTestData.EntityId1, + new CreateRatingInput + { + StarCount = 4 + }); + + await _ratingAppService.UpdateAsync(rating.Id, new UpdateRatingInput + { + StarCount = 5 + }); + + UsingDbContext(context => + { + var updatedRating = context.Set().Single(x => x.Id == rating.Id); + + updatedRating.StarCount.ShouldBe((short)5); + }); + } + + [Fact] + public async Task DeleteAsync() + { + _currentUser.Id.Returns(_cmsKitTestData.User1Id); + + var rating = await _ratingAppService.CreateAsync( + _cmsKitTestData.EntityType1, + _cmsKitTestData.EntityId1, + new CreateRatingInput + { + StarCount = 4 + }); + + await _ratingAppService.DeleteAsync(rating.Id); + + UsingDbContext(context => + { + var deletedComment = context.Set().FirstOrDefault(x => x.Id == rating.Id); + + deletedComment.ShouldBeNull(); + }); + } + } +} \ No newline at end of file diff --git a/modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/EntityFrameworkCore/Ratings/RatingRepository_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/EntityFrameworkCore/Ratings/RatingRepository_Tests.cs new file mode 100644 index 0000000000..390ddd1cb3 --- /dev/null +++ b/modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/EntityFrameworkCore/Ratings/RatingRepository_Tests.cs @@ -0,0 +1,9 @@ +using Volo.CmsKit.Ratings; + +namespace Volo.CmsKit.EntityFrameworkCore.Ratings +{ + public class RatingRepository_Tests : RatingRepository_Tests + { + + } +} \ No newline at end of file diff --git a/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/Ratings/RatingRepository_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/Ratings/RatingRepository_Tests.cs new file mode 100644 index 0000000000..c0814253e6 --- /dev/null +++ b/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/Ratings/RatingRepository_Tests.cs @@ -0,0 +1,11 @@ +using Volo.CmsKit.Ratings; +using Xunit; + +namespace Volo.CmsKit.MongoDB.Ratings +{ + [Collection(MongoTestCollection.Name)] + public class RatingRepository_Tests : RatingRepository_Tests + { + + } +} \ No newline at end of file diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs index 12c6255623..f91e79fb84 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs @@ -4,6 +4,7 @@ using Volo.Abp.DependencyInjection; using Volo.Abp.Guids; using Volo.Abp.Users; using Volo.CmsKit.Comments; +using Volo.CmsKit.Ratings; using Volo.CmsKit.Reactions; using Volo.CmsKit.Users; @@ -16,19 +17,22 @@ namespace Volo.CmsKit private readonly CmsKitTestData _cmsKitTestData; private readonly ICommentRepository _commentRepository; private readonly ReactionManager _reactionManager; + private readonly IRatingRepository _ratingRepository; public CmsKitDataSeedContributor( IGuidGenerator guidGenerator, ICmsUserRepository cmsUserRepository, CmsKitTestData cmsKitTestData, ICommentRepository commentRepository, - ReactionManager reactionManager) + ReactionManager reactionManager, + IRatingRepository ratingRepository) { _guidGenerator = guidGenerator; _cmsUserRepository = cmsUserRepository; _cmsKitTestData = cmsKitTestData; _commentRepository = commentRepository; _reactionManager = reactionManager; + _ratingRepository = ratingRepository; } public async Task SeedAsync(DataSeedContext context) @@ -38,13 +42,17 @@ namespace Volo.CmsKit await SeedCommentsAsync(); await SeedReactionsAsync(); + + await SeedRatingsAsync(); } private async Task SeedUsersAsync() { - await _cmsUserRepository.InsertAsync(new CmsUser(new UserData(_cmsKitTestData.User1Id, "user1", "user1@volo.com", + await _cmsUserRepository.InsertAsync(new CmsUser(new UserData(_cmsKitTestData.User1Id, "user1", + "user1@volo.com", "user", "1"))); - await _cmsUserRepository.InsertAsync(new CmsUser(new UserData(_cmsKitTestData.User2Id, "user2", "user2@volo.com", + await _cmsUserRepository.InsertAsync(new CmsUser(new UserData(_cmsKitTestData.User2Id, "user2", + "user2@volo.com", "user", "2"))); } @@ -131,5 +139,36 @@ namespace Volo.CmsKit _cmsKitTestData.EntityId1, StandardReactions.ThumbsUp); } + + private async Task SeedRatingsAsync() + { + await _ratingRepository.InsertAsync(new Rating(_guidGenerator.Create(), + _cmsKitTestData.EntityType1, + _cmsKitTestData.EntityId1, + 4, + _cmsKitTestData.User1Id + )); + + await _ratingRepository.InsertAsync(new Rating(_guidGenerator.Create(), + _cmsKitTestData.EntityType1, + _cmsKitTestData.EntityId1, + 5, + _cmsKitTestData.User1Id + )); + + await _ratingRepository.InsertAsync(new Rating(_guidGenerator.Create(), + _cmsKitTestData.EntityType2, + _cmsKitTestData.EntityId2, + 5, + _cmsKitTestData.User2Id + )); + + await _ratingRepository.InsertAsync(new Rating(_guidGenerator.Create(), + _cmsKitTestData.EntityType2, + _cmsKitTestData.EntityId2, + 1, + _cmsKitTestData.User2Id + )); + } } -} +} \ No newline at end of file diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/Ratings/RatingRepository_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/Ratings/RatingRepository_Tests.cs new file mode 100644 index 0000000000..b09b380f8e --- /dev/null +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/Ratings/RatingRepository_Tests.cs @@ -0,0 +1,49 @@ +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Modularity; +using Xunit; + +namespace Volo.CmsKit.Ratings +{ + public abstract class RatingRepository_Tests : CmsKitTestBase + where TStartupModule : IAbpModule + { + private readonly CmsKitTestData _cmsKitTestData; + private readonly IRatingRepository _ratingRepository; + + public RatingRepository_Tests() + { + _cmsKitTestData = GetRequiredService(); + _ratingRepository = GetRequiredService(); + } + + [Fact] + public async Task GetListAsync() + { + var list = await _ratingRepository.GetListAsync(_cmsKitTestData.EntityType1, _cmsKitTestData.EntityId1); + + list.Count.ShouldBeGreaterThan(0); + } + + [Fact] + public async Task GetCurrentUserRatingAsync() + { + var userRating = await _ratingRepository.GetCurrentUserRatingAsync(_cmsKitTestData.EntityType1, + _cmsKitTestData.EntityId1, _cmsKitTestData.User1Id); + + userRating.ShouldNotBeNull(); + userRating.EntityId.ShouldBe(_cmsKitTestData.EntityId1); + userRating.EntityType.ShouldBe(_cmsKitTestData.EntityType1); + userRating.CreatorId.ShouldBe(_cmsKitTestData.User1Id); + } + + [Fact] + public async Task GetGroupedStarCountsAsync() + { + var list = await _ratingRepository.GetGroupedStarCountsAsync(_cmsKitTestData.EntityType1, + _cmsKitTestData.EntityId1); + + list.ShouldNotBeNull(); + } + } +} \ No newline at end of file From 23ac23eb6b7afdc2530c0277b8857a7bae7cf8c0 Mon Sep 17 00:00:00 2001 From: EngincanV Date: Thu, 27 Aug 2020 15:21:18 +0300 Subject: [PATCH 010/116] CmsKit: Rating widget --- .../Shared/Components/Rating/Default.cshtml | 86 ++++++++++++++----- .../Shared/Components/Rating/default.css | 36 +------- .../Shared/Components/Rating/default.js | 82 +++++++++++++++++- 3 files changed, 145 insertions(+), 59 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml index f9cd651ff1..7c02d769a5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml @@ -1,27 +1,67 @@ -@using Volo.Abp.Users +@using Microsoft.AspNetCore.Mvc.Localization +@using Volo.Abp.Users +@using Volo.CmsKit.Localization @inject ICurrentUser CurrentUser +@model Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating.RatingViewModel +@inject IHtmlLocalizer L -@if (CurrentUser.IsAuthenticated) -{ -
-

My Simple Widget

-

This is a simple widget!

-
-} + -
- - +
+ @if (CurrentUser.IsAuthenticated) + { +
+ + @(Model.CurrentRating != null ? Model.CurrentRating.StarCount : 0) + if (Model.CurrentRating != null) + { + + @L["Undo"] + + } +
+
+

All Stars

+ @if (Model.Ratings != null) + { +
    + @foreach (var rating in Model.Ratings) + { +
  • + @rating.StarCount @L["Stars"] + @rating.Count +
  • + } +
+ } +
+ } + else + { + + } +
- - - - - - - - - - - -
\ No newline at end of file + + + \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.css b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.css index 0dc4780ee9..5f282702bb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.css +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.css @@ -1,35 +1 @@ -.rate { - float: left; - height: 46px; - padding: 0 10px; -} -.rate:not(:checked) > input { - position:absolute; - top:-9999px; -} -.rate:not(:checked) > label { - float:right; - width:1em; - overflow:hidden; - white-space:nowrap; - cursor:pointer; - font-size:30px; - color:#ccc; -} -.rate:not(:checked) > label:before { - content: '★ '; -} -.rate > input:checked ~ label { - color: #ffc700; -} -.rate:not(:checked) > label:hover, -.rate:not(:checked) > label:hover ~ label { - color: #deb217; -} -.rate > input:checked + label:hover, -.rate > input:checked + label:hover ~ label, -.rate > input:checked ~ label:hover, -.rate > input:checked ~ label:hover ~ label, -.rate > label:hover ~ input:checked ~ label { - color: #c59b08; -} \ No newline at end of file + \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js index 5f282702bb..1b29a47190 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js @@ -1 +1,81 @@ - \ No newline at end of file +(function () { + + var l = abp.localization.getResource("CmsKit"); + + $(document).ready(function () { + abp.widgets.CmsRating = function ($widget) { + var widgetManager = $widget.data("abp-widget-manager"); + var $ratingArea = $widget.find(".cms-rating-area"); + + function getFilters() { + return { + entityType: $ratingArea.attr("data-entity-type"), + entityId: $ratingArea.attr("data-entity-id") + }; + } + + function registerCreateOfNewRating() { + $(".my-rating-5").starRating({ + initialRating: 0, + disableAfterRate: true, + useFullStars: true, + readOnly: authenticated === "True", + onHover: function(currentIndex, currentRating, $el) { + $(".live-rating").text(currentIndex); + }, + onLeave: function(currentIndex, currentRating, $el) { + $(".live-rating").text(currentRating); + }, + callback: function(currentRating, $el) { + volo.cmsKit.public.ratings.ratingPublic.create( + $ratingArea.attr("data-entity-type"), + $ratingArea.attr("data-entity-id"), + { + starCount: parseInt(currentRating) + } + ).then(function () { + widgetManager.refresh($widget); + }) + } + }); + } + + function registerUndoLink() { + console.log("asdf"); + $(".rating-undo-link").on('click', '', function (e) { + e.preventDefault(); + + abp.message.confirm(l("RatingUndoMessage"), function (ok) { + if(ok) { + var id = $(".rating-undo-link").attr("data-id"); + volo.cmsKit.public.ratings.ratingPublic.delete( + id + ).then(function () { + widgetManager.refresh($widget); + }); + } + }) + }); + } + + function init() { + registerCreateOfNewRating(); + registerUndoLink(); + } + + return { + init: init, + getFilters: getFilters + } + }; + + $('.abp-widget-wrapper[data-widget-name="CmsRating"]') + .each(function () { + var widgetManager = new abp.WidgetManager({ + wrapper: $(this), + }); + + widgetManager.init($(this)); + }); + }); +})(jQuery); \ No newline at end of file From 97b3ff113508cb9aede3dbb4bcf7f4f7b418b64b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87otur?= Date: Thu, 27 Aug 2020 15:31:01 +0300 Subject: [PATCH 011/116] added rating style and script contributor --- .../star-rating-svg/css/star-rating-svg.css | 37 +++++++++++++++++++ .../js/jquery.star-rating-svg.min.js | 1 + .../Shared/Components/Rating/Default.cshtml | 31 ++++------------ .../Rating/RatingScriptBundleContributor.cs | 3 ++ .../Rating/RatingStyleBundleContributor.cs | 3 ++ .../Shared/Components/Rating/default.js | 17 +++++++++ 6 files changed, 69 insertions(+), 23 deletions(-) create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/star-rating-svg/css/star-rating-svg.css create mode 100644 modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/star-rating-svg/js/jquery.star-rating-svg.min.js diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/star-rating-svg/css/star-rating-svg.css b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/star-rating-svg/css/star-rating-svg.css new file mode 100644 index 0000000000..2c0114687f --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/star-rating-svg/css/star-rating-svg.css @@ -0,0 +1,37 @@ +.jq-stars { + display: inline-block; +} + +.jq-rating-label { + font-size: 22px; + display: inline-block; + position: relative; + vertical-align: top; + font-family: helvetica, arial, verdana; +} + +.jq-star { + width: 100px; + height: 100px; + display: inline-block; + cursor: pointer; +} + +.jq-star-svg { + width: 100%; + height: 100% ; +} + +.jq-star:hover .fs-star-svg polygon { +} + +.jq-star-svg polygon { + stroke: #000; + stroke-linejoin: round; +} + +/* un-used */ +.jq-shadow { + -webkit-filter: drop-shadow( -2px -2px 2px #888 ); + filter: drop-shadow( -2px -2px 2px #888 ); +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/star-rating-svg/js/jquery.star-rating-svg.min.js b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/star-rating-svg/js/jquery.star-rating-svg.min.js new file mode 100644 index 0000000000..df947cfe2b --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/wwwroot/libs/star-rating-svg/js/jquery.star-rating-svg.min.js @@ -0,0 +1 @@ +!function(a){"use strict";var b="starRating",c=function(){},d={totalStars:5,useFullStars:!1,emptyColor:"lightgray",hoverColor:"orange",activeColor:"gold",useGradient:!0,readOnly:!1,disableAfterRate:!0,starGradient:{start:"#FEF7CD",end:"#FF9511"},strokeWidth:0,strokeColor:"black",initialRating:0,starSize:40,callback:c,onHover:c,onLeave:c},e=function(c,e){var f;this.element=c,this.$el=a(c),this.settings=a.extend({},d,e),f=this.$el.data("rating")||this.settings.initialRating,this._state={rating:(Math.round(2*f)/2).toFixed(1)},this._uid=Math.floor(999*Math.random()),e.starGradient||this.settings.useGradient||(this.settings.starGradient.start=this.settings.starGradient.end=this.settings.activeColor),this._defaults=d,this._name=b,this.init()},f={init:function(){this.renderMarkup(),this.addListeners(),this.initRating()},addListeners:function(){this.settings.readOnly||(this.$stars.on("mouseover",this.hoverRating.bind(this)),this.$stars.on("mouseout",this.restoreState.bind(this)),this.$stars.on("click",this.handleRating.bind(this)))},hoverRating:function(a){var b=this.getIndex(a);this.paintStars(b,"hovered"),this.settings.onHover(b+1,this._state.rating,this.$el)},handleRating:function(a){var b=this.getIndex(a),c=b+1;this.applyRating(c,this.$el),this.executeCallback(c,this.$el),this.settings.disableAfterRate&&this.$stars.off()},applyRating:function(a){var b=a-1;this.paintStars(b,"active"),this._state.rating=b+1},restoreState:function(a){var b=this.getIndex(a),c=this._state.rating||-1;this.paintStars(c-1,"active"),this.settings.onLeave(b+1,this._state.rating,this.$el)},getIndex:function(b){var c=a(b.currentTarget),d=c.width(),e=a(b.target).attr("data-side");e=e?e:this.getOffsetByPixel(b,c,d),e=this.settings.useFullStars?"right":e;var f=c.index()-("left"===e?.5:0);return f=.5>f&&b.offsetX=d&&!this.settings.useFullStars?"left":"right"},initRating:function(){this.paintStars(this._state.rating-1,"active")},paintStars:function(b,c){var d,e,f,g;a.each(this.$stars,function(h,i){d=a(i).find('polygon[data-side="left"]'),e=a(i).find('polygon[data-side="right"]'),f=g=b>=h?c:"empty",f=h-b===.5?c:f,d.attr("class","svg-"+f+"-"+this._uid),e.attr("class","svg-"+g+"-"+this._uid)}.bind(this))},renderMarkup:function(){for(var a='
"+this.getLinearGradient(this._uid+"_SVGID_1_",this.settings.emptyColor,this.settings.emptyColor)+this.getLinearGradient(this._uid+"_SVGID_2_",this.settings.hoverColor,this.settings.hoverColor)+this.getLinearGradient(this._uid+"_SVGID_3_",this.settings.starGradient.start,this.settings.starGradient.end)+'
',b="",c=0;c '},executeCallback:function(a,b){var c=this.settings.callback;c(a,b)}},g={unload:function(){var c="plugin_"+b,d=a(this),e=d.data(c).$stars;e.off(),d.removeData(c).remove()},setRating:function(c,d){var e="plugin_"+b,f=a(this),g=f.data(e);c>g.settings.totalStars||0>c||(d&&(c=Math.round(c)),g.applyRating(c))},getRating:function(){var c="plugin_"+b,d=a(this),e=d.data(c);return e._state.rating}};a.extend(e.prototype,f),a.fn[b]=function(c){if(!a.isPlainObject(c)){if(g.hasOwnProperty(c))return g[c].apply(this,Array.prototype.slice.call(arguments,1));a.error("Method "+c+" does not exist on "+b+".js")}return this.each(function(){a.data(this,"plugin_"+b)||a.data(this,"plugin_"+b,new e(this,c))})}}(jQuery,window,document); \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml index 7c02d769a5..51b799d2e6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml @@ -1,11 +1,18 @@ @using Microsoft.AspNetCore.Mvc.Localization @using Volo.Abp.Users @using Volo.CmsKit.Localization +@using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating @inject ICurrentUser CurrentUser @model Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating.RatingViewModel @inject IHtmlLocalizer L - +@section styles{ + +} + +@section scripts{ + +}
@if (CurrentUser.IsAuthenticated) @@ -43,25 +50,3 @@
} - - - - \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingScriptBundleContributor.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingScriptBundleContributor.cs index a57ff8294f..4340cea485 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingScriptBundleContributor.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingScriptBundleContributor.cs @@ -1,8 +1,11 @@ using System.Collections.Generic; using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.AspNetCore.Mvc.UI.Packages.StarRatingSvg; +using Volo.Abp.Modularity; namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating { + [DependsOn(typeof(StarRatingSvgScriptContributor))] public class RatingScriptBundleContributor : BundleContributor { public override void ConfigureBundle(BundleConfigurationContext context) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingStyleBundleContributor.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingStyleBundleContributor.cs index dc82f1f5da..bd017f9d1e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingStyleBundleContributor.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingStyleBundleContributor.cs @@ -1,8 +1,11 @@ using System.Collections.Generic; using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.AspNetCore.Mvc.UI.Packages.StarRatingSvg; +using Volo.Abp.Modularity; namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating { + [DependsOn(typeof(StarRatingSvgStyleContributor))] public class RatingStyleBundleContributor : BundleContributor { public override void ConfigureBundle(BundleConfigurationContext context) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js index 1b29a47190..6bc8dc763e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js @@ -1,5 +1,22 @@ (function () { + var authenticated = $(".my-rating-5").attr("data-authenticated"); + $(".my-rating-5").starRating({ + initialRating: 0, + disableAfterRate: true, + useFullStars: true, + readOnly: authenticated === "True", + onHover: function(currentIndex, currentRating, $el) { + $(".live-rating").text(currentIndex); + }, + onLeave: function(currentIndex, currentRating, $el) { + $(".live-rating").text(currentRating); + }, + callback: function(currentRating, $el) { + alert(currentRating); + } + }); + var l = abp.localization.getResource("CmsKit"); $(document).ready(function () { From e96b5bf26b9888bdf2fd73539ef50524d1e82503 Mon Sep 17 00:00:00 2001 From: EngincanV Date: Thu, 27 Aug 2020 18:16:36 +0300 Subject: [PATCH 012/116] CmsKit: Rating widget design --- .../Shared/Components/Rating/Default.cshtml | 66 +++++++++---------- .../Components/Rating/RatingViewComponent.cs | 7 +- .../Shared/Components/Rating/default.css | 45 ++++++++++++- .../Shared/Components/Rating/default.js | 21 +----- 4 files changed, 82 insertions(+), 57 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml index 51b799d2e6..f1d96fa97e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml @@ -1,52 +1,46 @@ @using Microsoft.AspNetCore.Mvc.Localization @using Volo.Abp.Users @using Volo.CmsKit.Localization -@using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating @inject ICurrentUser CurrentUser @model Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating.RatingViewModel @inject IHtmlLocalizer L -@section styles{ - -} - -@section scripts{ - -} - -
+
@if (CurrentUser.IsAuthenticated) { -
- - @(Model.CurrentRating != null ? Model.CurrentRating.StarCount : 0) - if (Model.CurrentRating != null) - { - - @L["Undo"] - - } -
-
-

All Stars

- @if (Model.Ratings != null) +
+ + @(Model.CurrentRating != null ? Model.CurrentRating.StarCount + " | " : 0 + "") + @if (Model.CurrentRating != null) { -
    - @foreach (var rating in Model.Ratings) - { -
  • - @rating.StarCount @L["Stars"] - @rating.Count -
  • - } -
+ + @L["Undo"] + }
+ if (Model.Ratings != null) + { +
+ @foreach (var rating in Model.Ratings) + { +
+
@rating.StarCount @L["Stars"]
+
+
+
+
+
+
+
+
@rating.Count
+
+ } +
+ } } else { - +
"> + } -
+
\ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs index 31dedbc532..7c458d033b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; @@ -32,6 +33,7 @@ namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating public virtual async Task InvokeAsync(string entityType, string entityId) { var ratings = await RatingPublicAppService.GetGroupedStarCountsAsync(entityType, entityId); + var totalRating = ratings.Sum(x => x.Count); RatingDto currentUserRating = null; if (CurrentUser.IsAuthenticated) @@ -48,7 +50,8 @@ namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating EntityType = entityType, LoginUrl = loginUrl, Ratings = ratings, - CurrentRating = currentUserRating + CurrentRating = currentUserRating, + TotalRating = totalRating }; return View("~/Pages/CmsKit/Shared/Components/Rating/Default.cshtml", viewModel); @@ -66,5 +69,7 @@ namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating public List Ratings { get; set; } public RatingDto CurrentRating { get; set; } + + public int TotalRating { get; set; } } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.css b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.css index 5f282702bb..c38f44cace 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.css +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.css @@ -1 +1,44 @@ - \ No newline at end of file +.side { + width: 15%; + margin-top:10px; +} + +.middle { + float: left; + width: 70%; + margin-top:10px; + padding-top: 4px; +} + +.row:after { + content: ""; + display: table; + clear: both; +} + +.bar-container { + width: 100%; + background-color: #f1f1f1; + text-align: center; + color: white; +} + +.bar { + height: 18px; +} + +/* Individual bars */ +.bar-5 { background-color: #173F5F; } +.bar-4 { background-color: #20639B; } +.bar-3 { background-color: #3CAEA3; } +.bar-2 { background-color: #F6D55C; } +.bar-1 { background-color: #ED553B; } + +@media (max-width: 400px) { + .side, .middle { + width: 100%; + } + .right { + display: none; + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js index 6bc8dc763e..2835e57a3c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js @@ -1,22 +1,4 @@ (function () { - var authenticated = $(".my-rating-5").attr("data-authenticated"); - - $(".my-rating-5").starRating({ - initialRating: 0, - disableAfterRate: true, - useFullStars: true, - readOnly: authenticated === "True", - onHover: function(currentIndex, currentRating, $el) { - $(".live-rating").text(currentIndex); - }, - onLeave: function(currentIndex, currentRating, $el) { - $(".live-rating").text(currentRating); - }, - callback: function(currentRating, $el) { - alert(currentRating); - } - }); - var l = abp.localization.getResource("CmsKit"); $(document).ready(function () { @@ -32,6 +14,8 @@ } function registerCreateOfNewRating() { + var authenticated = $(".my-rating-5").attr("data-authenticated"); + $(".my-rating-5").starRating({ initialRating: 0, disableAfterRate: true, @@ -58,7 +42,6 @@ } function registerUndoLink() { - console.log("asdf"); $(".rating-undo-link").on('click', '', function (e) { e.preventDefault(); From bebcd1313de64923d54a74e5326a4d9f424971dc Mon Sep 17 00:00:00 2001 From: EngincanV Date: Fri, 28 Aug 2020 09:16:28 +0300 Subject: [PATCH 013/116] CmsKit: Rating missing localizations --- .../Volo/CmsKit/Localization/Resources/en.json | 6 +++++- .../Volo/CmsKit/Localization/Resources/tr.json | 6 +++++- .../Pages/CmsKit/Shared/Components/Rating/Default.cshtml | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 3e16a17a47..73fd2d52b6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -13,6 +13,10 @@ "LoginToAddComment": "Login to add comment", "LoginToReply": "Login to reply", "MessageDeletionConfirmationMessage": "This comment will be deleted completely.", - "CommentAuthorizationExceptionMessage": "Those comments are not allowed for public display." + "CommentAuthorizationExceptionMessage": "Those comments are not allowed for public display.", + "Undo": "Undo", + "RatingUndoMessage": "Your rating will be undo.", + "LoginToRate": "Login to rate", + "Star": "Star" } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json index c1664f9122..777e89c979 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json @@ -13,6 +13,10 @@ "LoginToAddComment": "Yorum yapmak için giriş yap", "LoginToReply": "Cevap vermek için giriş yap", "MessageDeletionConfirmationMessage": "Bu yorum tamamen silinecektir", - "CommentAuthorizationExceptionMessage": "Bu yorumları görebilmek için yetki gerekir." + "CommentAuthorizationExceptionMessage": "Bu yorumları görebilmek için yetki gerekir.", + "Undo": "Geri al", + "RatingUndoMessage": "Oylamanız geri alınacak.", + "LoginToRate": "Oylamak için giriş yapın", + "Star": "Yıldız" } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml index f1d96fa97e..51c47f93de 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml @@ -24,7 +24,7 @@ @foreach (var rating in Model.Ratings) {
-
@rating.StarCount @L["Stars"]
+
@rating.StarCount @L["Star"]
From 2b646ff9d6694b0085c5031e74ec21bb7d6ba97f Mon Sep 17 00:00:00 2001 From: EngincanV Date: Fri, 28 Aug 2020 09:39:08 +0300 Subject: [PATCH 014/116] Update Index.cshtml --- .../cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml index ab628d4412..6fc38ba28b 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Pages/Index.cshtml @@ -60,5 +60,8 @@
-@await Component.InvokeAsync(typeof(RatingViewComponent), new { entityType = "quote", entityId = "2" }) +@if (GlobalFeatureManager.Instance.IsEnabled()) +{ + @await Component.InvokeAsync(typeof(RatingViewComponent), new { entityType = "quote", entityId = "2" }) +}
From e0c46f9434b13961570cd0a21285768005bb1643 Mon Sep 17 00:00:00 2001 From: EngincanV Date: Mon, 31 Aug 2020 17:59:52 +0300 Subject: [PATCH 015/116] CmsKit: enhancement after reviewing --- .../CmsKitWebUnifiedModule.cs | 1 + .../Volo/CmsKit/Ratings/RatingConsts.cs | 4 + .../Volo/CmsKit/Ratings/IRatingRepository.cs | 6 -- .../Volo/CmsKit/Ratings/Rating.cs | 2 +- .../CmsKitDbContextModelCreatingExtensions.cs | 2 +- .../CmsKit/Ratings/EfCoreRatingRepository.cs | 12 --- .../MongoDB/Ratings/MongoRatingRepository.cs | 12 --- ...ingInput.cs => CreateUpdateRatingInput.cs} | 4 +- .../Public/Ratings/IRatingPublicAppService.cs | 8 +- .../Public/Ratings/RatingWithStarCountDto.cs | 2 + .../Public/Ratings/UpdateRatingInput.cs | 10 -- .../PublicApplicationAutoMapperProfile.cs | 2 - .../Public/Ratings/RatingPublicAppService.cs | 69 ++++++------ .../Public/Ratings/RatingPublicController.cs | 26 +---- .../Shared/Components/Rating/Default.cshtml | 6 +- .../Components/Rating/RatingViewComponent.cs | 8 +- .../Shared/Components/Rating/default.js | 100 ++++++++++-------- .../Volo.CmsKit.Public.Web.csproj | 4 - .../Ratings/RatingPublicAppService_Tests.cs | 70 ++++++++---- .../Ratings/RatingRepository_Tests.cs | 8 -- 20 files changed, 168 insertions(+), 188 deletions(-) rename modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/{CreateRatingInput.cs => CreateUpdateRatingInput.cs} (63%) delete mode 100644 modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/UpdateRatingInput.cs diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs index 08dadb3dd6..e5d9f23c05 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs @@ -1,4 +1,5 @@ using System.IO; +using System.Linq; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Ratings/RatingConsts.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Ratings/RatingConsts.cs index 892b3cef45..27fa9d7584 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Ratings/RatingConsts.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Ratings/RatingConsts.cs @@ -7,5 +7,9 @@ namespace Volo.CmsKit.Ratings public static int MaxEntityTypeLength { get; set; } = CmsEntityConsts.MaxEntityTypeLength; public static int MaxEntityIdLength { get; set; } = CmsEntityConsts.MaxEntityIdLength; + + public static int MaxRating { get; set; } = 5; + + public static int MinRating { get; set; } = 0; } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/IRatingRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/IRatingRepository.cs index 29ce07df63..a9f71b0dfb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/IRatingRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/IRatingRepository.cs @@ -9,12 +9,6 @@ namespace Volo.CmsKit.Ratings { public interface IRatingRepository : IBasicRepository { - Task> GetListAsync( - [NotNull] string entityType, - [NotNull] string entityId, - CancellationToken cancellationToken = default - ); - Task GetCurrentUserRatingAsync( [NotNull] string entityType, [NotNull] string entityId, diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs index 4567b5d275..75f0499db3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs @@ -44,7 +44,7 @@ namespace Volo.CmsKit.Ratings public virtual void SetStarCount(short starCount) { - if(starCount <= 5 && starCount > 0) + if(starCount <= RatingConsts.MaxRating && starCount > RatingConsts.MinRating) { StarCount = starCount; } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs index d73f60967a..adda59c3e2 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs @@ -85,7 +85,7 @@ namespace Volo.CmsKit.EntityFrameworkCore r.Property(x => x.EntityType).IsRequired().HasMaxLength(RatingConsts.MaxEntityTypeLength); r.Property(x => x.EntityId).IsRequired().HasMaxLength(RatingConsts.MaxEntityIdLength); - r.HasIndex(x => new {x.TenantId, x.EntityType, x.EntityId}); + r.HasIndex(x => new {x.TenantId, x.EntityType, x.EntityId, x.CreatorId}); }); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs index 577f2e3a7d..810335b4d6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Ratings/EfCoreRatingRepository.cs @@ -18,18 +18,6 @@ namespace Volo.CmsKit.Ratings { } - public async Task> GetListAsync(string entityType, string entityId, - CancellationToken cancellationToken = default) - { - Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); - Check.NotNullOrWhiteSpace(entityId, nameof(entityId)); - - var query = DbSet.Where(r => r.EntityType == entityType && r.EntityId == entityId); - var ratings = await query.ToListAsync(GetCancellationToken(cancellationToken)); - - return ratings; - } - public async Task GetCurrentUserRatingAsync(string entityType, string entityId, Guid userId, CancellationToken cancellationToken = default) { diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Ratings/MongoRatingRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Ratings/MongoRatingRepository.cs index ecf389cde7..92f7f992da 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Ratings/MongoRatingRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Ratings/MongoRatingRepository.cs @@ -19,18 +19,6 @@ namespace Volo.CmsKit.MongoDB.Ratings { } - public async Task> GetListAsync(string entityType, string entityId, - CancellationToken cancellationToken = default) - { - Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); - Check.NotNullOrWhiteSpace(entityId, nameof(entityId)); - - var query = GetMongoQueryable().Where(r => r.EntityType == entityType && r.EntityId == entityId); - var ratings = await query.ToListAsync(GetCancellationToken(cancellationToken)); - - return ratings; - } - public async Task GetCurrentUserRatingAsync(string entityType, string entityId, Guid userId, CancellationToken cancellationToken = default) { diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/CreateRatingInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/CreateUpdateRatingInput.cs similarity index 63% rename from modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/CreateRatingInput.cs rename to modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/CreateUpdateRatingInput.cs index 88b53d5b0c..3018ed8b30 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/CreateRatingInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/CreateUpdateRatingInput.cs @@ -2,9 +2,9 @@ namespace Volo.CmsKit.Public.Ratings { - public class CreateRatingInput + public class CreateUpdateRatingInput { - [Required] + [Required, Range(1, 5)] public short StarCount { get; set; } } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/IRatingPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/IRatingPublicAppService.cs index 9e4c8c1f11..aa0aba48b4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/IRatingPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/IRatingPublicAppService.cs @@ -8,13 +8,9 @@ namespace Volo.CmsKit.Public.Ratings { public interface IRatingPublicAppService : IApplicationService { - Task> GetListAsync(string entityType, string entityId); - - Task CreateAsync(string entityType, string entityId, CreateRatingInput input); - - Task UpdateAsync(Guid id, UpdateRatingInput input); + Task CreateAsync(string entityType, string entityId, CreateUpdateRatingInput input); - Task DeleteAsync(Guid id); + Task DeleteAsync(string entityType, string entityId); Task GetCurrentUserRatingAsync(string entityType, string entityId); diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/RatingWithStarCountDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/RatingWithStarCountDto.cs index e8f60ea49b..981ef2bd6e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/RatingWithStarCountDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/RatingWithStarCountDto.cs @@ -5,5 +5,7 @@ public short StarCount { get; set; } public int Count { get; set; } + + public bool IsSelectedByCurrentUser { get; set; } } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/UpdateRatingInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/UpdateRatingInput.cs deleted file mode 100644 index e2f77122d4..0000000000 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/UpdateRatingInput.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Volo.CmsKit.Public.Ratings -{ - public class UpdateRatingInput - { - [Required] - public short StarCount { get; set; } - } -} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs index 0a0a5403b1..3ac2d1949b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs @@ -22,8 +22,6 @@ namespace Volo.CmsKit.Public .Ignore(x=> x.Author); CreateMap(); - - CreateMap(); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Ratings/RatingPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Ratings/RatingPublicAppService.cs index 7621924727..848dbeda28 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Ratings/RatingPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Ratings/RatingPublicAppService.cs @@ -22,18 +22,22 @@ namespace Volo.CmsKit.Public.Ratings CmsUserLookupService = cmsUserLookupService; } - public virtual async Task> GetListAsync(string entityType, string entityId) + [Authorize] + public virtual async Task CreateAsync(string entityType, string entityId, + CreateUpdateRatingInput input) { - var ratings = await RatingRepository.GetListAsync(entityType, entityId); - var ratingDto = ObjectMapper.Map, List>(ratings); + var userId = CurrentUser.GetId(); + var user = await CmsUserLookupService.GetByIdAsync(userId); - return new ListResultDto(ratingDto); - } + var currentUserRating = await RatingRepository.GetCurrentUserRatingAsync(entityType, entityId, userId); - [Authorize] - public virtual async Task CreateAsync(string entityType, string entityId, CreateRatingInput input) - { - var user = await CmsUserLookupService.GetByIdAsync(CurrentUser.GetId()); + if (currentUserRating != null) + { + currentUserRating.SetStarCount(input.StarCount); + var updatedRating = await RatingRepository.UpdateAsync(currentUserRating); + + return ObjectMapper.Map(updatedRating); + } var rating = await RatingRepository.InsertAsync( new Rating( @@ -50,50 +54,51 @@ namespace Volo.CmsKit.Public.Ratings } [Authorize] - public virtual async Task UpdateAsync(Guid id, UpdateRatingInput input) - { - var rating = await RatingRepository.GetAsync(id); - - if (rating.CreatorId != CurrentUser.GetId()) - { - throw new AbpAuthorizationException(); - } - - rating.SetStarCount(input.StarCount); - - var updatedRating = await RatingRepository.UpdateAsync(rating); - - return ObjectMapper.Map(updatedRating); - } - - [Authorize] - public virtual async Task DeleteAsync(Guid id) + public virtual async Task DeleteAsync(string entityType, string entityId) { - var rating = await RatingRepository.GetAsync(id); + var rating = await RatingRepository.GetCurrentUserRatingAsync(entityType, entityId, CurrentUser.GetId()); if (rating.CreatorId != CurrentUser.GetId()) { throw new AbpAuthorizationException(); } - await RatingRepository.DeleteAsync(id); + await RatingRepository.DeleteAsync(rating.Id); } [Authorize] public virtual async Task GetCurrentUserRatingAsync(string entityType, string entityId) { var currentUserId = CurrentUser.GetId(); - + var rating = await RatingRepository.GetCurrentUserRatingAsync(entityType, entityId, currentUserId); return ObjectMapper.Map(rating); } - public virtual async Task> GetGroupedStarCountsAsync(string entityType, string entityId) + public virtual async Task> GetGroupedStarCountsAsync(string entityType, + string entityId) { var ratings = await RatingRepository.GetGroupedStarCountsAsync(entityType, entityId); - return ObjectMapper.Map, List>(ratings); + var userRatingOrNull = CurrentUser.IsAuthenticated + ? await RatingRepository.GetCurrentUserRatingAsync(entityType, entityId, CurrentUser.GetId()) + : null; + + var ratingWithStarCountDto = new List(); + + foreach (var rating in ratings) + { + ratingWithStarCountDto.Add( + new RatingWithStarCountDto + { + StarCount = rating.StarCount, + Count = rating.Count, + IsSelectedByCurrentUser = userRatingOrNull != null && userRatingOrNull.StarCount == rating.StarCount + }); + } + + return ratingWithStarCountDto; } } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Ratings/RatingPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Ratings/RatingPublicController.cs index 25cc40ea5a..e136c4564d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Ratings/RatingPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Ratings/RatingPublicController.cs @@ -1,9 +1,7 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Volo.Abp; -using Volo.Abp.Application.Dtos; using Volo.Abp.GlobalFeatures; using Volo.CmsKit.GlobalFeatures; @@ -22,32 +20,18 @@ namespace Volo.CmsKit.Public.Ratings RatingPublicAppService = ratingPublicAppService; } - [HttpGet] - [Route("{entityType}/{entityId}")] - public virtual Task> GetListAsync(string entityType, string entityId) - { - return RatingPublicAppService.GetListAsync(entityType, entityId); - } - [HttpPut] [Route("{entityType}/{entityId}")] - public virtual Task CreateAsync(string entityType, string entityId, CreateRatingInput input) + public virtual Task CreateAsync(string entityType, string entityId, CreateUpdateRatingInput input) { return RatingPublicAppService.CreateAsync(entityType, entityId, input); } - [HttpPut] - [Route("{id}")] - public virtual Task UpdateAsync(Guid id, UpdateRatingInput input) - { - return RatingPublicAppService.UpdateAsync(id, input); - } - [HttpDelete] - [Route("{id}")] - public virtual Task DeleteAsync(Guid id) + [Route("{entityType}/{entityId}")] + public virtual Task DeleteAsync(string entityType, string entityId) { - return RatingPublicAppService.DeleteAsync(id); + return RatingPublicAppService.DeleteAsync(entityType, entityId); } [HttpGet] diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml index 51c47f93de..b5cfbbfaa9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml @@ -9,11 +9,11 @@ @if (CurrentUser.IsAuthenticated) {
- - @(Model.CurrentRating != null ? Model.CurrentRating.StarCount + " | " : 0 + "") + + @(Model.CurrentRating != null ? Model.CurrentRating + " | " : 0 + "") @if (Model.CurrentRating != null) { - + @L["Undo"] } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs index 7c458d033b..aabbd3c286 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs @@ -34,11 +34,11 @@ namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating { var ratings = await RatingPublicAppService.GetGroupedStarCountsAsync(entityType, entityId); var totalRating = ratings.Sum(x => x.Count); - - RatingDto currentUserRating = null; + + short? currentUserRating = null; if (CurrentUser.IsAuthenticated) { - currentUserRating = await RatingPublicAppService.GetCurrentUserRatingAsync(entityType, entityId); + currentUserRating = ratings.Find(x => x.IsSelectedByCurrentUser)?.StarCount; } var loginUrl = @@ -68,7 +68,7 @@ namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating public List Ratings { get; set; } - public RatingDto CurrentRating { get; set; } + public short? CurrentRating { get; set; } public int TotalRating { get; set; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js index 2835e57a3c..4416d7fb48 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js @@ -1,81 +1,89 @@ (function () { var l = abp.localization.getResource("CmsKit"); - + $(document).ready(function () { abp.widgets.CmsRating = function ($widget) { var widgetManager = $widget.data("abp-widget-manager"); var $ratingArea = $widget.find(".cms-rating-area"); - + function getFilters() { return { entityType: $ratingArea.attr("data-entity-type"), entityId: $ratingArea.attr("data-entity-id") }; } - + function registerCreateOfNewRating() { - var authenticated = $(".my-rating-5").attr("data-authenticated"); + $widget.find(".my-rating-5").each(function () { + var authenticated = $(this).attr("data-authenticated"); - $(".my-rating-5").starRating({ - initialRating: 0, - disableAfterRate: true, - useFullStars: true, - readOnly: authenticated === "True", - onHover: function(currentIndex, currentRating, $el) { - $(".live-rating").text(currentIndex); - }, - onLeave: function(currentIndex, currentRating, $el) { - $(".live-rating").text(currentRating); - }, - callback: function(currentRating, $el) { - volo.cmsKit.public.ratings.ratingPublic.create( - $ratingArea.attr("data-entity-type"), - $ratingArea.attr("data-entity-id"), - { - starCount: parseInt(currentRating) + $(this).starRating({ + initialRating: 0, + disableAfterRate: true, + useFullStars: true, + readOnly: authenticated === "True", + onHover: function (currentIndex, currentRating, $el) { + $widget.find(".live-rating").text(currentIndex); + }, + onLeave: function (currentIndex, currentRating, $el) { + $widget.find(".live-rating").text(currentRating); + }, + callback: function (currentRating, $el) { + volo.cmsKit.public.ratings.ratingPublic.create( + $ratingArea.attr("data-entity-type"), + $ratingArea.attr("data-entity-id"), + { + starCount: parseInt(currentRating) + } + ).then(function () { + widgetManager.refresh($widget); + }) } - ).then(function () { - widgetManager.refresh($widget); - }) + }); } - }); + ); } - + function registerUndoLink() { - $(".rating-undo-link").on('click', '', function (e) { - e.preventDefault(); - - abp.message.confirm(l("RatingUndoMessage"), function (ok) { - if(ok) { - var id = $(".rating-undo-link").attr("data-id"); - volo.cmsKit.public.ratings.ratingPublic.delete( - id - ).then(function () { - widgetManager.refresh($widget); - }); - } - }) + $widget.find(".rating-undo-link").each(function () { + $(this).on('click', '', function (e) { + e.preventDefault(); + + abp.message.confirm(l("RatingUndoMessage"), function (ok) { + if (ok) { + volo.cmsKit.public.ratings.ratingPublic.delete( + $ratingArea.attr("data-entity-type"), + $ratingArea.attr("data-entity-id") + ).then(function () { + widgetManager.refresh($widget); + }); + } + }) + }); }); } - + function init() { registerCreateOfNewRating(); registerUndoLink(); } - + return { init: init, getFilters: getFilters } - }; - + } + ; + $('.abp-widget-wrapper[data-widget-name="CmsRating"]') .each(function () { var widgetManager = new abp.WidgetManager({ wrapper: $(this), }); - + widgetManager.init($(this)); }); - }); -})(jQuery); \ No newline at end of file + }) + ; +}) +(jQuery); \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj index 3d52f544e0..6d2f8ff303 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj @@ -27,10 +27,6 @@ - - true - PreserveNewest - diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Ratings/RatingPublicAppService_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Ratings/RatingPublicAppService_Tests.cs index 1a21da8425..c8f2acd950 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Ratings/RatingPublicAppService_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Ratings/RatingPublicAppService_Tests.cs @@ -1,5 +1,6 @@ using System.Linq; using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using NSubstitute; using Shouldly; @@ -34,8 +35,8 @@ namespace Volo.CmsKit.Ratings var newRating = await _ratingAppService.CreateAsync( _cmsKitTestData.EntityType1, - _cmsKitTestData.EntityId1, - new CreateRatingInput + _cmsKitTestData.EntityId2, + new CreateUpdateRatingInput { StarCount = 4 }); @@ -44,53 +45,86 @@ namespace Volo.CmsKit.Ratings { var ratings = context.Set().Where(x => x.EntityId == _cmsKitTestData.EntityId1 && x.EntityType == _cmsKitTestData.EntityType1).ToList(); - + ratings - .Any(c => c.Id == newRating.Id && c.CreatorId == newRating.CreatorId && c.StarCount == newRating.StarCount) + .Any(c => c.Id == newRating.Id && c.CreatorId == newRating.CreatorId && + c.StarCount == newRating.StarCount) .ShouldBeTrue(); }); } [Fact] - public async Task UpdateAsync() + public async Task CreateAsync_Should_Update_If_Rating_Is_Exist() { _currentUser.Id.Returns(_cmsKitTestData.User1Id); - var rating = await _ratingAppService.CreateAsync( + var entity = + await _ratingAppService.GetCurrentUserRatingAsync(_cmsKitTestData.EntityType1, + _cmsKitTestData.EntityId1); + + var updatedEntity = await _ratingAppService.CreateAsync( _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId1, - new CreateRatingInput + new CreateUpdateRatingInput { - StarCount = 4 + StarCount = 5 }); - await _ratingAppService.UpdateAsync(rating.Id, new UpdateRatingInput - { - StarCount = 5 - }); + entity.Id.ShouldBe(updatedEntity.Id); + entity.EntityId.ShouldBe(updatedEntity.EntityId); + entity.EntityType.ShouldBe(updatedEntity.EntityType); + entity.StarCount.ShouldBe(updatedEntity.StarCount); + } + + [Fact] + public async Task GetCurrentUserRatingAsync() + { + _currentUser.Id.Returns(_cmsKitTestData.User1Id); + + var rating = await _ratingAppService.GetCurrentUserRatingAsync( + _cmsKitTestData.EntityType1, + _cmsKitTestData.EntityId1 + ); UsingDbContext(context => { - var updatedRating = context.Set().Single(x => x.Id == rating.Id); - - updatedRating.StarCount.ShouldBe((short)5); + var ratings = context.Set().Where(x => + x.EntityId == _cmsKitTestData.EntityId1 && x.EntityType == _cmsKitTestData.EntityType1).ToList(); + + ratings + .Any(c => c.Id == rating.Id && c.EntityId == rating.EntityId && c.EntityType == rating.EntityType) + .ShouldBeTrue(); }); } + [Fact] + public async Task GetGroupedStarCountsAsync() + { + _currentUser.Id.Returns(_cmsKitTestData.User1Id); + + var ratings = await _ratingAppService.GetGroupedStarCountsAsync( + _cmsKitTestData.EntityType1, + _cmsKitTestData.EntityId1 + ); + + ratings.ShouldNotBeNull(); + ratings.Count.ShouldBeGreaterThan(0); + } + [Fact] public async Task DeleteAsync() { _currentUser.Id.Returns(_cmsKitTestData.User1Id); - + var rating = await _ratingAppService.CreateAsync( _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId1, - new CreateRatingInput + new CreateUpdateRatingInput { StarCount = 4 }); - await _ratingAppService.DeleteAsync(rating.Id); + await _ratingAppService.DeleteAsync(_cmsKitTestData.EntityType1, _cmsKitTestData.EntityId1); UsingDbContext(context => { diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/Ratings/RatingRepository_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/Ratings/RatingRepository_Tests.cs index b09b380f8e..19da73cf50 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/Ratings/RatingRepository_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/Ratings/RatingRepository_Tests.cs @@ -17,14 +17,6 @@ namespace Volo.CmsKit.Ratings _ratingRepository = GetRequiredService(); } - [Fact] - public async Task GetListAsync() - { - var list = await _ratingRepository.GetListAsync(_cmsKitTestData.EntityType1, _cmsKitTestData.EntityId1); - - list.Count.ShouldBeGreaterThan(0); - } - [Fact] public async Task GetCurrentUserRatingAsync() { From 905ad6311b4b89651dea6689e77611140552d2cb Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Tue, 1 Sep 2020 13:04:53 +0800 Subject: [PATCH 016/116] Replace the obsolete AddIdentityServerAuthentication method. Resolve #5179 --- .../MyCompanyName.MyProjectName.HttpApi.Host.csproj | 2 +- .../MyProjectNameHttpApiHostModule.cs | 9 +++++---- ...yCompanyName.MyProjectName.HttpApi.HostWithIds.csproj | 1 - .../MyProjectNameHttpApiHostModule.cs | 6 +++--- .../MyCompanyName.MyProjectName.Web.csproj | 1 - .../MyProjectNameWebModule.cs | 4 ++-- .../src/MyCompanyName.MyProjectName.Web/appsettings.json | 2 +- 7 files changed, 12 insertions(+), 13 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 71b248c32e..e497fa9a69 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 @@ -14,7 +14,7 @@ - + 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 3771a1874d..e71450209f 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 @@ -1,6 +1,7 @@ using System; using System.IO; using System.Linq; +using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.DataProtection; @@ -88,12 +89,12 @@ namespace MyCompanyName.MyProjectName private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration) { - context.Services.AddAuthentication("Bearer") - .AddIdentityServerAuthentication(options => + context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) + .AddJwtBearer(options => { options.Authority = configuration["AuthServer:Authority"]; - options.RequireHttpsMetadata = true; - options.ApiName = "MyProjectName"; + options.RequireHttpsMetadata = false; + options.Audience = "MyProjectName"; }); } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj index 373d19dcfb..45b4e0517b 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj @@ -14,7 +14,6 @@ - diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs index 95a26d9084..1cd8ea1c0b 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs @@ -92,12 +92,12 @@ namespace MyCompanyName.MyProjectName private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration) { context.Services.AddAuthentication() - .AddIdentityServerAuthentication(options => + .AddJwtBearer(options => { options.Authority = configuration["AuthServer:Authority"]; options.RequireHttpsMetadata = false; - options.ApiName = "MyProjectName"; - options.JwtBackChannelHandler = new HttpClientHandler() + options.Audience = "MyProjectName"; + options.BackchannelHttpHandler = new HttpClientHandler() { ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator }; diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj index eb374cb80e..961e8e33d4 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj @@ -36,7 +36,6 @@ - diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs index cf201f90cc..8f63e0768f 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs @@ -94,11 +94,11 @@ namespace MyCompanyName.MyProjectName.Web private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration) { context.Services.AddAuthentication() - .AddIdentityServerAuthentication(options => + .AddJwtBearer(options => { options.Authority = configuration["AuthServer:Authority"]; options.RequireHttpsMetadata = false; - options.ApiName = "MyProjectName"; + options.Audience = "MyProjectName"; }); } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/appsettings.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/appsettings.json index 99a24b4a2d..6cfe8948fa 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/appsettings.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/appsettings.json @@ -6,7 +6,7 @@ "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=MyProjectName;Trusted_Connection=True;MultipleActiveResultSets=true" }, "AuthServer": { - "Authority": "https://localhost:44301" + "Authority": "https://localhost:44303" }, "IdentityServer": { "Clients": { From f0799b4d83f5a5f97dd275b694fae22918877510 Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Tue, 1 Sep 2020 13:06:21 +0800 Subject: [PATCH 017/116] RequireHttpsMetadata true. --- .../MyProjectNameHttpApiHostModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e71450209f..b217a0ada7 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 @@ -93,7 +93,7 @@ namespace MyCompanyName.MyProjectName .AddJwtBearer(options => { options.Authority = configuration["AuthServer:Authority"]; - options.RequireHttpsMetadata = false; + options.RequireHttpsMetadata = true; options.Audience = "MyProjectName"; }); } From 1a6c14ee8b0f0e8c6bfa479a0519792d1affc7db Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Tue, 1 Sep 2020 13:15:33 +0800 Subject: [PATCH 018/116] Replace AddIdentityServerAuthentication in app module template. --- .../MyCompanyName.MyProjectName.HttpApi.Host.csproj | 3 ++- .../MyProjectNameHttpApiHostModule.cs | 9 +++++---- .../MyCompanyName.MyProjectName.IdentityServer.csproj | 1 - .../MyProjectNameIdentityServerModule.cs | 8 ++++---- 4 files changed, 11 insertions(+), 10 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 35e73d4868..8e5e31fcc6 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 @@ -13,7 +13,8 @@ - + + 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 6d5bf1a7c8..0145f8a41a 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 @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Security.Claims; using IdentityModel; +using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.DataProtection; @@ -103,12 +104,12 @@ namespace MyCompanyName.MyProjectName AbpClaimTypes.Role = JwtClaimTypes.Role; AbpClaimTypes.Email = JwtClaimTypes.Email; - context.Services.AddAuthentication("Bearer") - .AddIdentityServerAuthentication(options => + context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) + .AddJwtBearer(options => { options.Authority = configuration["AuthServer:Authority"]; options.RequireHttpsMetadata = false; - options.ApiName = "MyProjectName"; + options.Audience = "MyProjectName"; }); Configure(options => @@ -163,7 +164,7 @@ namespace MyCompanyName.MyProjectName app.UseCorrelationId(); app.UseVirtualFiles(); app.UseRouting(); - app.UseCors(DefaultCorsPolicyName); + app.UseCors(DefaultCorsPolicyName); app.UseAuthentication(); app.UseAbpClaimsMap(); if (MultiTenancyConsts.IsEnabled) 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 c70808deed..3b18a90d7e 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 @@ -11,7 +11,6 @@ - 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 cfda73627d..2eed1ad3cb 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs @@ -118,11 +118,11 @@ namespace MyCompanyName.MyProjectName }); context.Services.AddAuthentication() - .AddIdentityServerAuthentication(options => + .AddJwtBearer(options => { options.Authority = configuration["AuthServer:Authority"]; options.RequireHttpsMetadata = false; - options.ApiName = configuration["AuthServer:ApiName"]; + options.Audience = configuration["AuthServer:ApiName"]; }); Configure(options => @@ -182,10 +182,10 @@ namespace MyCompanyName.MyProjectName app.UseCorrelationId(); app.UseVirtualFiles(); app.UseRouting(); - app.UseCors(DefaultCorsPolicyName); + app.UseCors(DefaultCorsPolicyName); app.UseAuthentication(); app.UseJwtTokenMiddleware(); - + if (MultiTenancyConsts.IsEnabled) { app.UseMultiTenancy(); From be0ac62f5cbf5a209ecb80450085d281fc35c40b Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Tue, 1 Sep 2020 13:33:18 +0800 Subject: [PATCH 019/116] Update cms-kit module. --- .../Volo.CmsKit.HttpApi.Host/CmsKitHttpApiHostModule.cs | 7 ++++--- .../Volo.CmsKit.HttpApi.Host.csproj | 3 ++- .../CmsKitIdentityServerModule.cs | 4 ++-- .../Volo.CmsKit.IdentityServer.csproj | 1 - 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/CmsKitHttpApiHostModule.cs b/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/CmsKitHttpApiHostModule.cs index f1a9b8568f..fe9df5d7b6 100644 --- a/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/CmsKitHttpApiHostModule.cs +++ b/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/CmsKitHttpApiHostModule.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Security.Claims; using IdentityModel; +using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.DataProtection; @@ -108,12 +109,12 @@ namespace Volo.CmsKit AbpClaimTypes.Role = JwtClaimTypes.Role; AbpClaimTypes.Email = JwtClaimTypes.Email; - context.Services.AddAuthentication("Bearer") - .AddIdentityServerAuthentication(options => + context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) + .AddJwtBearer(options => { options.Authority = configuration["AuthServer:Authority"]; options.RequireHttpsMetadata = false; - options.ApiName = "CmsKit"; + options.Audience = "CmsKit"; }); Configure(options => diff --git a/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.csproj b/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.csproj index 9fa7c4be20..99b2d0f1c0 100644 --- a/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.csproj +++ b/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.csproj @@ -13,7 +13,8 @@ - + + diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/CmsKitIdentityServerModule.cs b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/CmsKitIdentityServerModule.cs index b9afe934a3..5fbff7cfeb 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/CmsKitIdentityServerModule.cs +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/CmsKitIdentityServerModule.cs @@ -123,11 +123,11 @@ namespace Volo.CmsKit }); context.Services.AddAuthentication() - .AddIdentityServerAuthentication(options => + .AddJwtBearer(options => { options.Authority = configuration["AuthServer:Authority"]; options.RequireHttpsMetadata = false; - options.ApiName = configuration["AuthServer:ApiName"]; + options.Audience = configuration["AuthServer:ApiName"]; }); Configure(options => diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/Volo.CmsKit.IdentityServer.csproj b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/Volo.CmsKit.IdentityServer.csproj index b26c2bbe06..a32a6c2dc3 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/Volo.CmsKit.IdentityServer.csproj +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/Volo.CmsKit.IdentityServer.csproj @@ -11,7 +11,6 @@ - From a542a88a8047ebaea3aeaa81e302a6a2859f6b7b Mon Sep 17 00:00:00 2001 From: EngincanV Date: Tue, 1 Sep 2020 12:16:46 +0300 Subject: [PATCH 020/116] CmsKit: last changes after review --- .../Volo/CmsKit/Ratings/RatingConsts.cs | 4 ++-- .../src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs | 4 ++-- .../Volo/CmsKit/Public/Ratings/CreateUpdateRatingInput.cs | 3 ++- .../Pages/CmsKit/Shared/Components/Rating/Default.cshtml | 2 +- .../CmsKit/Shared/Components/Rating/RatingViewComponent.cs | 2 +- .../Pages/CmsKit/Shared/Components/Rating/default.js | 6 ++---- 6 files changed, 10 insertions(+), 11 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Ratings/RatingConsts.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Ratings/RatingConsts.cs index 27fa9d7584..d52bec599b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Ratings/RatingConsts.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Ratings/RatingConsts.cs @@ -8,8 +8,8 @@ namespace Volo.CmsKit.Ratings public static int MaxEntityIdLength { get; set; } = CmsEntityConsts.MaxEntityIdLength; - public static int MaxRating { get; set; } = 5; + public const int MaxStarCount = 5; - public static int MinRating { get; set; } = 0; + public const int MinStarCount = 1; } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs index 75f0499db3..a3575cf0b4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Ratings/Rating.cs @@ -44,13 +44,13 @@ namespace Volo.CmsKit.Ratings public virtual void SetStarCount(short starCount) { - if(starCount <= RatingConsts.MaxRating && starCount > RatingConsts.MinRating) + if(starCount <= RatingConsts.MaxStarCount && starCount >= RatingConsts.MinStarCount) { StarCount = starCount; } else { - throw new ArgumentOutOfRangeException("Choosen star must between 1 and 5"); + throw new ArgumentOutOfRangeException($"Choosen star must between {RatingConsts.MinStarCount} and {RatingConsts.MaxStarCount}"); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/CreateUpdateRatingInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/CreateUpdateRatingInput.cs index 3018ed8b30..c6fa01b7d4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/CreateUpdateRatingInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/CreateUpdateRatingInput.cs @@ -1,10 +1,11 @@ using System.ComponentModel.DataAnnotations; +using Volo.CmsKit.Ratings; namespace Volo.CmsKit.Public.Ratings { public class CreateUpdateRatingInput { - [Required, Range(1, 5)] + [Required, Range(RatingConsts.MinStarCount, RatingConsts.MaxStarCount)] public short StarCount { get; set; } } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml index b5cfbbfaa9..82397e49c4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/Default.cshtml @@ -5,7 +5,7 @@ @model Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating.RatingViewModel @inject IHtmlLocalizer L -
+
@if (CurrentUser.IsAuthenticated) {
diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs index aabbd3c286..cae050ea40 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/RatingViewComponent.cs @@ -42,7 +42,7 @@ namespace Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Rating } var loginUrl = - $"{AbpMvcUiOptions.LoginUrl}?returnUrl={HttpContext.Request.Path.ToString()}&returnUrlHash=#cms-comment_{entityType}_{entityId}"; + $"{AbpMvcUiOptions.LoginUrl}?returnUrl={HttpContext.Request.Path.ToString()}&returnUrlHash=#cms-rating_{entityType}_{entityId}"; var viewModel = new RatingViewModel { diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js index 4416d7fb48..431fd7884b 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Rating/default.js @@ -72,8 +72,7 @@ init: init, getFilters: getFilters } - } - ; + }; $('.abp-widget-wrapper[data-widget-name="CmsRating"]') .each(function () { @@ -83,7 +82,6 @@ widgetManager.init($(this)); }); - }) - ; + }); }) (jQuery); \ No newline at end of file From a3685d4d5bb481123598ec4b39e8f38d8a7b5f47 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 1 Sep 2020 15:58:33 +0300 Subject: [PATCH 021/116] Allow to add new tabs to the account profile manage page --- .../Account/Localization/Resources/en.json | 4 +- .../Account/Localization/Resources/tr.json | 4 +- .../AbpAccountWebAutomapperProfile.cs | 3 +- .../AbpAccountWebModule.cs | 31 +++++++- ...ilePasswordManagementGroupViewComponent.cs | 59 +++++++++++++++ .../Password/Default.cshtml | 17 +++++ .../Password/Default.js | 31 ++++++++ ...ersonalInfoManagementGroupViewComponent.cs | 56 ++++++++++++++ .../PersonalInfo/Default.cshtml | 39 ++++++++++ .../PersonalInfo/Default.js | 19 +++++ .../Pages/Account/Manage.cshtml | 73 +++++-------------- .../Pages/Account/Manage.cshtml.cs | 72 +++--------------- .../Pages/Account/Manage.js | 47 ------------ .../Pages/Account/Register.cshtml.cs | 1 - ...AccountProfileManagementPageContributor.cs | 48 ++++++++++++ .../IProfileManagementPageContributor.cs | 9 +++ .../ProfileManagementPageCreationContext.cs | 19 +++++ .../ProfileManagementPageGroup.cs | 39 ++++++++++ .../ProfileManagementPageOptions.cs | 14 ++++ 19 files changed, 417 insertions(+), 168 deletions(-) create mode 100644 modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/Password/AccountProfilePasswordManagementGroupViewComponent.cs create mode 100644 modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/Password/Default.cshtml create mode 100644 modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/Password/Default.js create mode 100644 modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/AccountProfilePersonalInfoManagementGroupViewComponent.cs create mode 100644 modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml create mode 100644 modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.js delete mode 100644 modules/account/src/Volo.Abp.Account.Web/Pages/Account/Manage.js create mode 100644 modules/account/src/Volo.Abp.Account.Web/ProfileManagement/AccountProfileManagementPageContributor.cs create mode 100644 modules/account/src/Volo.Abp.Account.Web/ProfileManagement/IProfileManagementPageContributor.cs create mode 100644 modules/account/src/Volo.Abp.Account.Web/ProfileManagement/ProfileManagementPageCreationContext.cs create mode 100644 modules/account/src/Volo.Abp.Account.Web/ProfileManagement/ProfileManagementPageGroup.cs create mode 100644 modules/account/src/Volo.Abp.Account.Web/ProfileManagement/ProfileManagementPageOptions.cs 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 e9215d3f5a..85bd040d8c 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 @@ -53,6 +53,8 @@ "ResetPassword_Information": "Please enter your new password.", "YourPasswordIsSuccessfullyReset": "Your password is successfully reset.", "GoToTheApplication": "Go to the application", - "BackToLogin": "Back to login" + "BackToLogin": "Back to login", + "ProfileTab:Password": "Change password", + "ProfileTab:PersonalInfo": "Personal info" } } 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 bbb2ac3638..c9aff72675 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 @@ -52,6 +52,8 @@ "ResetPassword_Information": "Lütfen yeni şifrenizi belirleyin.", "YourPasswordIsSuccessfullyReset": "Şifreniz başarıyla sıfırlandı.", "GoToTheApplication": "Uygulamaya git", - "BackToLogin": "Girişe dön" + "BackToLogin": "Girişe dön", + "ProfileTab:Password": "Şifre değiştir", + "ProfileTab:PersonalInfo": "Kişisel bilgiler" } } diff --git a/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebAutomapperProfile.cs b/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebAutomapperProfile.cs index ab7ea41269..6204c20582 100644 --- a/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebAutomapperProfile.cs +++ b/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebAutomapperProfile.cs @@ -1,6 +1,7 @@ using Volo.Abp.Account.Web.Pages.Account; using Volo.Abp.Identity; using AutoMapper; +using Volo.Abp.Account.Web.Pages.Account.Components.ProfileManagementGroup.PersonalInfo; namespace Volo.Abp.Account.Web { @@ -8,7 +9,7 @@ namespace Volo.Abp.Account.Web { public AbpAccountWebAutoMapperProfile() { - CreateMap(); + CreateMap(); } } } diff --git a/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebModule.cs b/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebModule.cs index 10886e4c17..303963d24f 100644 --- a/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebModule.cs +++ b/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebModule.cs @@ -1,7 +1,10 @@ using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Account.Localization; +using Volo.Abp.Account.Web.Pages.Account; +using Volo.Abp.Account.Web.ProfileManagement; using Volo.Abp.AspNetCore.Mvc.Localization; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars; using Volo.Abp.AutoMapper; @@ -50,16 +53,38 @@ namespace Volo.Abp.Account.Web options.Contributors.Add(new AccountModuleToolbarContributor()); }); + ConfigureProfileManagementPage(); + + context.Services.AddAutoMapperObjectMapper(); + Configure(options => + { + options.AddProfile(validate: true); + }); + } + + private void ConfigureProfileManagementPage() + { Configure(options => { options.Conventions.AuthorizePage("/Account/Manage"); }); - context.Services.AddAutoMapperObjectMapper(); - Configure(options => + Configure(options => { - options.AddProfile(validate: true); + options.Contributors.Add(new AccountProfileManagementPageContributor()); }); + + Configure(options => + { + options.ScriptBundles + .Configure(typeof(ManageModel).FullName, + configuration => + { + configuration.AddFiles("/Pages/Account/Components/ProfileManagementGroup/Password/Default.js"); + configuration.AddFiles("/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.js"); + }); + }); + } } } diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/Password/AccountProfilePasswordManagementGroupViewComponent.cs b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/Password/AccountProfilePasswordManagementGroupViewComponent.cs new file mode 100644 index 0000000000..7a0df6878b --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/Password/AccountProfilePasswordManagementGroupViewComponent.cs @@ -0,0 +1,59 @@ +using System.ComponentModel.DataAnnotations; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.Auditing; +using Volo.Abp.Identity; +using Volo.Abp.Validation; + +namespace Volo.Abp.Account.Web.Pages.Account.Components.ProfileManagementGroup.Password +{ + public class AccountProfilePasswordManagementGroupViewComponent : AbpViewComponent + { + private readonly IProfileAppService _profileAppService; + + public AccountProfilePasswordManagementGroupViewComponent( + IProfileAppService profileAppService) + { + _profileAppService = profileAppService; + } + + public async Task InvokeAsync() + { + var user = await _profileAppService.GetAsync(); + + var model = new ChangePasswordInfoModel + { + HideOldPasswordInput = !user.HasPassword + }; + + return View("~/Pages/Account/Components/ProfileManagementGroup/Password/Default.cshtml", model); + } + + public class ChangePasswordInfoModel + { + [Required] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPasswordLength))] + [Display(Name = "DisplayName:CurrentPassword")] + [DataType(DataType.Password)] + [DisableAuditing] + public string CurrentPassword { get; set; } + + [Required] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPasswordLength))] + [Display(Name = "DisplayName:NewPassword")] + [DataType(DataType.Password)] + [DisableAuditing] + public string NewPassword { get; set; } + + [Required] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPasswordLength))] + [Display(Name = "DisplayName:NewPasswordConfirm")] + [DataType(DataType.Password)] + [DisableAuditing] + public string NewPasswordConfirm { get; set; } + + public bool HideOldPasswordInput { get; set; } + } + } +} diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/Password/Default.cshtml b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/Password/Default.cshtml new file mode 100644 index 0000000000..febab6d081 --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/Password/Default.cshtml @@ -0,0 +1,17 @@ +@using Volo.Abp.Account.Localization +@using Volo.Abp.Users +@using Microsoft.AspNetCore.Mvc.Localization +@inject IHtmlLocalizer L +@inject ICurrentUser CurrentUser +@model Volo.Abp.Account.Web.Pages.Account.Components.ProfileManagementGroup.Password.AccountProfilePasswordManagementGroupViewComponent.ChangePasswordInfoModel + +

@L["ChangePassword"]


+
+ @if (!Model.HideOldPasswordInput) + { + + } + + + + diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/Password/Default.js b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/Password/Default.js new file mode 100644 index 0000000000..ef38f68466 --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/Password/Default.js @@ -0,0 +1,31 @@ +(function ($) { + $(function () { + var l = abp.localization.getResource("AbpAccount"); + + $('#ChangePasswordForm').submit(function (e) { + e.preventDefault(); + + if (!$('#ChangePasswordForm').valid()) { + return false; + } + + var input = $('#ChangePasswordForm').serializeFormToObject(); + + if ( + input.newPassword != input.newPasswordConfirm || + input.newPassword == '' + ) { + abp.message.error(l('NewPasswordConfirmFailed')); + return; + } + + if (input.currentPassword && input.currentPassword == ''){ + return; + } + + volo.abp.identity.profile.changePassword(input).then(function (result) { + abp.message.success(l('PasswordChanged')); + }); + }); + }); +})(jQuery); diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/AccountProfilePersonalInfoManagementGroupViewComponent.cs b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/AccountProfilePersonalInfoManagementGroupViewComponent.cs new file mode 100644 index 0000000000..512d646ff2 --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/AccountProfilePersonalInfoManagementGroupViewComponent.cs @@ -0,0 +1,56 @@ +using System.ComponentModel.DataAnnotations; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.Identity; +using Volo.Abp.Validation; + +namespace Volo.Abp.Account.Web.Pages.Account.Components.ProfileManagementGroup.PersonalInfo +{ + public class AccountProfilePersonalInfoManagementGroupViewComponent : AbpViewComponent + { + private readonly IProfileAppService _profileAppService; + + public AccountProfilePersonalInfoManagementGroupViewComponent( + IProfileAppService profileAppService) + { + _profileAppService = profileAppService; + + ObjectMapperContext = typeof(AbpAccountWebModule); + } + + public async Task InvokeAsync() + { + var user = await _profileAppService.GetAsync(); + + var model = ObjectMapper.Map(user); + + return View("~/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml", model); + } + + public class PersonalInfoModel + { + [Required] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxUserNameLength))] + [Display(Name = "DisplayName:UserName")] + public string UserName { get; set; } + + [Required] + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxEmailLength))] + [Display(Name = "DisplayName:Email")] + public string Email { get; set; } + + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxNameLength))] + [Display(Name = "DisplayName:Name")] + public string Name { get; set; } + + [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxSurnameLength))] + [Display(Name = "DisplayName:Surname")] + public string Surname { get; set; } + + [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/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml new file mode 100644 index 0000000000..33ca670b0c --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml @@ -0,0 +1,39 @@ +@using Volo.Abp.Account.Localization +@using Volo.Abp.Users +@using Microsoft.AspNetCore.Mvc.Localization +@using Volo.Abp.AspNetCore.Mvc.UI.Theming +@using Volo.Abp.Identity.Settings +@using Volo.Abp.Settings +@inject IHtmlLocalizer L +@inject ICurrentUser CurrentUser +@inject ISettingProvider SettingManager +@inject IThemeManager ThemeManager +@model Volo.Abp.Account.Web.Pages.Account.Components.ProfileManagementGroup.PersonalInfo.AccountProfilePersonalInfoManagementGroupViewComponent.PersonalInfoModel +@{ + var isUserNameUpdateEnabled = string.Equals(await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsUserNameUpdateEnabled), "true", + StringComparison.OrdinalIgnoreCase); + + var isEmailUpdateEnabled = string.Equals(await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsEmailUpdateEnabled), "true", + StringComparison.OrdinalIgnoreCase); +} + +

@L["PersonalSettings"]


+
+ + + + + + + + + + + + + + + + + + diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.js b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.js new file mode 100644 index 0000000000..6f5642d07d --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.js @@ -0,0 +1,19 @@ +(function ($) { + $(function () { + var l = abp.localization.getResource("AbpAccount"); + + $('#PersonalSettingsForm').submit(function (e) { + e.preventDefault(); + + if (!$('#PersonalSettingsForm').valid()) { + return false; + } + + var input = $('#PersonalSettingsForm').serializeFormToObject(); + + volo.abp.identity.profile.update(input).then(function (result) { + abp.notify.success(l('PersonalSettingsSaved')); + }); + }); + }); +})(jQuery); diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Manage.cshtml b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Manage.cshtml index 23350442b2..ff6262f3ec 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Manage.cshtml +++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Manage.cshtml @@ -2,66 +2,33 @@ @using Microsoft.AspNetCore.Mvc.Localization @using Volo.Abp.Account.Localization @using Volo.Abp.Account.Web.Pages.Account -@using Volo.Abp.Identity.Settings -@using Volo.Abp.Settings @using Volo.Abp.AspNetCore.Mvc.UI.Theming -@inject ISettingProvider SettingManager @inject IThemeManager ThemeManager @inject IHtmlLocalizer L @model ManageModel @{ Layout = ThemeManager.CurrentTheme.GetApplicationLayout(); - var isUserNameUpdateEnabled = string.Equals(await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsUserNameUpdateEnabled), "true", - StringComparison.OrdinalIgnoreCase); - - var isEmailUpdateEnabled = string.Equals(await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsEmailUpdateEnabled), "true", - StringComparison.OrdinalIgnoreCase); } @section scripts { - - - + } - - - - @if (!Model.DisablePasswordChange) - { - -

@L["ChangePassword"].Value


-
- @if (!Model.HideOldPasswordInput) - { - - } - - - - -
- } - -

@L["PersonalSettings"].Value


-
- - - - - - - - - - - - - - - - - -
-
-
-
+
+ + + + @foreach (var group in Model.ProfileManagementPageCreationContext.Groups) + { + +

@group.DisplayName

+
+ @await Component.InvokeAsync(group.ComponentType, new + { + parameter = group.Parameter + }) +
+ } +
+
+
+
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 db51f9890c..f7b08eb6c4 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,35 +2,31 @@ using System.Threading.Tasks; using Volo.Abp.Identity; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; +using Volo.Abp.Account.Web.ProfileManagement; using Volo.Abp.Validation; namespace Volo.Abp.Account.Web.Pages.Account { public class ManageModel : AccountPageModel { - public ChangePasswordInfoModel ChangePasswordInfoModel { get; set; } + public ProfileManagementPageCreationContext ProfileManagementPageCreationContext { get; private set; } - public PersonalSettingsInfoModel PersonalSettingsInfoModel { get; set; } + protected ProfileManagementPageOptions Options { get; } - public bool DisablePasswordChange { get; set; } - - public bool HideOldPasswordInput { get; set; } - - protected IProfileAppService ProfileAppService { get; } - - public ManageModel(IProfileAppService profileAppService) + public ManageModel(IOptions options) { - ProfileAppService = profileAppService; + Options = options.Value; } public virtual async Task OnGetAsync() { - var user = await ProfileAppService.GetAsync(); - - PersonalSettingsInfoModel = ObjectMapper.Map(user); + ProfileManagementPageCreationContext = new ProfileManagementPageCreationContext(ServiceProvider); - DisablePasswordChange = user.IsExternal; - HideOldPasswordInput = !user.HasPassword; + foreach (var contributor in Options.Contributors) + { + await contributor.ConfigureAsync(ProfileManagementPageCreationContext); + } return Page(); } @@ -40,50 +36,4 @@ namespace Volo.Abp.Account.Web.Pages.Account return Task.FromResult(Page()); } } - - public class ChangePasswordInfoModel - { - [Required] - [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPasswordLength))] - [Display(Name = "DisplayName:CurrentPassword")] - [DataType(DataType.Password)] - public string CurrentPassword { get; set; } - - [Required] - [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPasswordLength))] - [Display(Name = "DisplayName:NewPassword")] - [DataType(DataType.Password)] - public string NewPassword { get; set; } - - [Required] - [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxPasswordLength))] - [Display(Name = "DisplayName:NewPasswordConfirm")] - [DataType(DataType.Password)] - public string NewPasswordConfirm { get; set; } - } - - public class PersonalSettingsInfoModel - { - [Required] - [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxUserNameLength))] - [Display(Name = "DisplayName:UserName")] - public string UserName { get; set; } - - [Required] - [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxEmailLength))] - [Display(Name = "DisplayName:Email")] - public string Email { get; set; } - - [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxNameLength))] - [Display(Name = "DisplayName:Name")] - public string Name { get; set; } - - [DynamicStringLength(typeof(IdentityUserConsts), nameof(IdentityUserConsts.MaxSurnameLength))] - [Display(Name = "DisplayName:Surname")] - public string Surname { get; set; } - - [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/Manage.js b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Manage.js deleted file mode 100644 index 3c7c4148e8..0000000000 --- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/Manage.js +++ /dev/null @@ -1,47 +0,0 @@ -(function ($) { - var l = abp.localization.getResource('AbpAccount'); - - var _profileService = volo.abp.identity.profile; - - $('#ChangePasswordForm').submit(function (e) { - e.preventDefault(); - - if (!$('#ChangePasswordForm').valid()) { - return false; - } - - var input = $('#ChangePasswordForm').serializeFormToObject() - .changePasswordInfoModel; - - if ( - input.newPassword != input.newPasswordConfirm || - input.newPassword == '' - ) { - abp.message.error(l('NewPasswordConfirmFailed')); - return; - } - - if (input.currentPassword && input.currentPassword == ''){ - return; - } - - _profileService.changePassword(input).then(function (result) { - abp.message.success(l('PasswordChanged')); - }); - }); - - $('#PersonalSettingsForm').submit(function (e) { - e.preventDefault(); - - if (!$('#PersonalSettingsForm').valid()) { - return false; - } - - var input = $('#PersonalSettingsForm').serializeFormToObject() - .personalSettingsInfoModel; - - _profileService.update(input).then(function (result) { - abp.notify.success(l('PersonalSettingsSaved')); - }); - }); -})(jQuery); 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 a8ec942084..0560197cd3 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 @@ -18,7 +18,6 @@ namespace Volo.Abp.Account.Web.Pages.Account { public class RegisterModel : AccountPageModel { - protected IAccountAppService AccountAppService { get; } [BindProperty(SupportsGet = true)] public string ReturnUrl { get; set; } diff --git a/modules/account/src/Volo.Abp.Account.Web/ProfileManagement/AccountProfileManagementPageContributor.cs b/modules/account/src/Volo.Abp.Account.Web/ProfileManagement/AccountProfileManagementPageContributor.cs new file mode 100644 index 0000000000..3f2a11ac86 --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.Web/ProfileManagement/AccountProfileManagementPageContributor.cs @@ -0,0 +1,48 @@ +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Localization; +using Volo.Abp.Account.Localization; +using Volo.Abp.Account.Web.Pages.Account.Components.ProfileManagementGroup.Password; +using Volo.Abp.Account.Web.Pages.Account.Components.ProfileManagementGroup.PersonalInfo; +using Volo.Abp.Identity; +using Volo.Abp.Users; + +namespace Volo.Abp.Account.Web.ProfileManagement +{ + public class AccountProfileManagementPageContributor : IProfileManagementPageContributor + { + public async Task ConfigureAsync(ProfileManagementPageCreationContext context) + { + var l = context.ServiceProvider.GetRequiredService>(); + + if (await IsPasswordChangeEnabled(context)) + { + context.Groups.Add( + new ProfileManagementPageGroup( + "Volo.Abp.Account.Password", + l["ProfileTab:Password"], + typeof(AccountProfilePasswordManagementGroupViewComponent) + ) + ); + } + + context.Groups.Add( + new ProfileManagementPageGroup( + "Volo.Abp.Account.PersonalInfo", + l["ProfileTab:PersonalInfo"], + typeof(AccountProfilePersonalInfoManagementGroupViewComponent) + ) + ); + } + + protected virtual async Task IsPasswordChangeEnabled(ProfileManagementPageCreationContext context) + { + var userManager = context.ServiceProvider.GetRequiredService(); + var currentUser = context.ServiceProvider.GetRequiredService(); + + var user = await userManager.GetByIdAsync(currentUser.GetId()); + + return !user.IsExternal; + } + } +} diff --git a/modules/account/src/Volo.Abp.Account.Web/ProfileManagement/IProfileManagementPageContributor.cs b/modules/account/src/Volo.Abp.Account.Web/ProfileManagement/IProfileManagementPageContributor.cs new file mode 100644 index 0000000000..d65cc1fb0d --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.Web/ProfileManagement/IProfileManagementPageContributor.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + + namespace Volo.Abp.Account.Web.ProfileManagement +{ + public interface IProfileManagementPageContributor + { + Task ConfigureAsync(ProfileManagementPageCreationContext context); + } +} diff --git a/modules/account/src/Volo.Abp.Account.Web/ProfileManagement/ProfileManagementPageCreationContext.cs b/modules/account/src/Volo.Abp.Account.Web/ProfileManagement/ProfileManagementPageCreationContext.cs new file mode 100644 index 0000000000..f3a9a80de7 --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.Web/ProfileManagement/ProfileManagementPageCreationContext.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; + +namespace Volo.Abp.Account.Web.ProfileManagement +{ + public class ProfileManagementPageCreationContext + { + public IServiceProvider ServiceProvider { get; } + + public List Groups { get; } + + public ProfileManagementPageCreationContext(IServiceProvider serviceProvider) + { + ServiceProvider = serviceProvider; + + Groups = new List(); + } + } +} diff --git a/modules/account/src/Volo.Abp.Account.Web/ProfileManagement/ProfileManagementPageGroup.cs b/modules/account/src/Volo.Abp.Account.Web/ProfileManagement/ProfileManagementPageGroup.cs new file mode 100644 index 0000000000..ff491107aa --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.Web/ProfileManagement/ProfileManagementPageGroup.cs @@ -0,0 +1,39 @@ +using System; +using JetBrains.Annotations; + +namespace Volo.Abp.Account.Web.ProfileManagement +{ + public class ProfileManagementPageGroup + { + public string Id + { + get => _id; + set => _id = Check.NotNullOrWhiteSpace(value, nameof(Id)); + } + private string _id; + + public string DisplayName + { + get => _displayName; + set => _displayName = Check.NotNullOrWhiteSpace(value, nameof(DisplayName)); + } + private string _displayName; + + public Type ComponentType + { + get => _componentType; + set => _componentType = Check.NotNull(value, nameof(ComponentType)); + } + private Type _componentType; + + public object Parameter { get; set; } + + public ProfileManagementPageGroup([NotNull] string id, [NotNull] string displayName, [NotNull] Type componentType, object parameter = null) + { + Id = id; + DisplayName = displayName; + ComponentType = componentType; + Parameter = parameter; + } + } +} diff --git a/modules/account/src/Volo.Abp.Account.Web/ProfileManagement/ProfileManagementPageOptions.cs b/modules/account/src/Volo.Abp.Account.Web/ProfileManagement/ProfileManagementPageOptions.cs new file mode 100644 index 0000000000..91cf0ab0c1 --- /dev/null +++ b/modules/account/src/Volo.Abp.Account.Web/ProfileManagement/ProfileManagementPageOptions.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; + + namespace Volo.Abp.Account.Web.ProfileManagement +{ + public class ProfileManagementPageOptions + { + public List Contributors { get; } + + public ProfileManagementPageOptions() + { + Contributors = new List(); + } + } +} From 453771ba31c9e1a40a9730a66f9009cea3862b89 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 1 Sep 2020 23:14:15 +0800 Subject: [PATCH 022/116] Introduce DynamicRangeAttribute --- .../AbpValidationAttributeAdapterProvider.cs | 9 ++- .../DynamicRangeAttributeAdapter.cs | 46 +++++++++++++ .../Abp/Validation/DynamicRangeAttribute.cs | 64 +++++++++++++++++++ .../Validation/ValidationTestController.cs | 36 +++++++++-- .../ValidationTestController_Tests.cs | 19 ++++-- 5 files changed, 161 insertions(+), 13 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicRangeAttributeAdapter.cs create mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicRangeAttribute.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 c9b7cb21b3..e5131592d0 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 @@ -27,8 +27,13 @@ namespace Volo.Abp.AspNetCore.Mvc.DataAnnotations { return new DynamicMaxLengthAttributeAdapter((DynamicMaxLengthAttribute) attribute, stringLocalizer); } - + + if (type == typeof(DynamicRangeAttribute)) + { + return new DynamicRangeAttributeAdapter((DynamicRangeAttribute) 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/DynamicRangeAttributeAdapter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicRangeAttributeAdapter.cs new file mode 100644 index 0000000000..f084c559ad --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicRangeAttributeAdapter.cs @@ -0,0 +1,46 @@ +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 DynamicRangeAttributeAdapter : AttributeAdapterBase + { + private readonly string _max; + private readonly string _min; + + public DynamicRangeAttributeAdapter( + DynamicRangeAttribute attribute, + IStringLocalizer stringLocalizer) + : base(attribute, stringLocalizer) + { + _min = Attribute.Minimum.ToString()?.ToString(CultureInfo.InvariantCulture); + _max = Attribute.Maximum.ToString()?.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)); + MergeAttribute(context.Attributes, "data-val-length-min", _min); + MergeAttribute(context.Attributes, "data-val-length-max", _max); + } + + public override string GetErrorMessage(ModelValidationContextBase validationContext) + { + Check.NotNull(validationContext, nameof(validationContext)); + + return GetErrorMessage( + validationContext.ModelMetadata, + validationContext.ModelMetadata.GetDisplayName(), + Attribute.Minimum, + Attribute.Maximum + ); + } + } +} diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicRangeAttribute.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicRangeAttribute.cs new file mode 100644 index 0000000000..2836987302 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicRangeAttribute.cs @@ -0,0 +1,64 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics; +using System.Reflection; +using JetBrains.Annotations; + +namespace Volo.Abp.Validation +{ + public class DynamicRangeAttribute : RangeAttribute + { + private static readonly FieldInfo MaximumField; + private static readonly FieldInfo MinimumField; + + static DynamicRangeAttribute() + { + MaximumField = typeof(RangeAttribute).GetField( + "k__BackingField", + BindingFlags.Instance | BindingFlags.NonPublic + ); + Debug.Assert(MaximumField != null, nameof(MaximumField) + " != null"); + + MinimumField = typeof(RangeAttribute).GetField( + "k__BackingField", + BindingFlags.Instance | BindingFlags.NonPublic + ); + Debug.Assert(MinimumField != null, nameof(MinimumField) + " != 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 + /// The type of the range parameters. Must implement IComparable. + public DynamicRangeAttribute( + [NotNull] Type sourceType, + [NotNull] Type operandType, + [CanBeNull] string minimumPropertyName, + [CanBeNull] string maximumPropertyName + ) + : base(operandType, string.Empty, string.Empty) + { + Check.NotNull(sourceType, nameof(sourceType)); + + if (minimumPropertyName != null) + { + var minimumProperty = sourceType.GetProperty( + minimumPropertyName, + BindingFlags.Static | BindingFlags.Public + ); + Debug.Assert(minimumProperty != null, nameof(minimumProperty) + " != null"); + MinimumField.SetValue(this, minimumProperty.GetValue(null)); + } + + if (maximumPropertyName != null) + { + var maximumProperty = sourceType.GetProperty( + maximumPropertyName, + BindingFlags.Static | BindingFlags.Public + ); + Debug.Assert(maximumProperty != null, nameof(maximumProperty) + " != null"); + MaximumField.SetValue(this, maximumProperty.GetValue(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 6ce47c4679..de0e24002f 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 @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Threading.Tasks; @@ -32,7 +33,7 @@ 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) @@ -47,7 +48,7 @@ namespace Volo.Abp.AspNetCore.Mvc.Validation [StringLength(5, MinimumLength = 2)] public string Value1 { get; set; } } - + public class ValidationDynamicTestModel { [DynamicStringLength(typeof(Consts), nameof(Consts.MaxValue1Length), nameof(Consts.MinValue1Length))] @@ -55,18 +56,41 @@ 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; } - + + [DynamicRange(typeof(Consts), typeof(int), nameof(Consts.MinValue1), nameof(Consts.MaxValue1))] + public int Value4 { get; set; } + + [DynamicRange(typeof(Consts), typeof(double), nameof(Consts.MinValue2), nameof(Consts.MaxValue2))] + public double Value5 { get; set; } + + [DynamicRange(typeof(Consts), typeof(DateTime), nameof(Consts.MinValue3), nameof(Consts.MaxValue3))] + public DateTime Value6 { 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; + + + public static int MinValue1 { get; set; } = 1; + + public static int MaxValue1 { get; set; } = 5; + + + public static double MinValue2 { get; set; } = 1.2; + + public static double MaxValue2 { get; set; } = 7.2; + + public static string MinValue3 { get; set; } = "1/2/2004"; + + public static string MaxValue3 { get; set; } = "3/4/2004"; } } @@ -83,4 +107,4 @@ 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 9e22784ba7..715e55799a 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,9 +61,9 @@ 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&value3[0]=53&value3[1]=54"); + var result = await GetResponseAsStringAsync("/api/validation-test/object-result-action-dynamic-length?value1=hello&value3[0]=53&value3[1]=54&value4=4&value5=1.5&value6=2004-02-04"); result.ShouldBe("hello"); - + } [Fact] @@ -71,15 +71,24 @@ namespace Volo.Abp.AspNetCore.Mvc.Validation { 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=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); + + result = await GetResponseAsObjectAsync("/api/validation-test/object-result-action-dynamic-length?value1=123458&value3[0]=53&value3[1]=54&value[4]=10", HttpStatusCode.BadRequest); //value4 has max num of 5. + 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&value4=2&value5=1.1", HttpStatusCode.BadRequest); //value4 has min num of 1.2. + 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&value4=2&value5=1.2&value6=2004-05-04", HttpStatusCode.BadRequest); //value4 has max date of 3/4/2004. + result.Error.ValidationErrors.Length.ShouldBeGreaterThan(0); } } } From a2743fd3cd953aee3dd75924d47cb6fed8038de4 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 2 Sep 2020 10:03:54 +0800 Subject: [PATCH 023/116] Improved --- .../DataAnnotations/DynamicRangeAttributeAdapter.cs | 10 +++++----- .../Volo/Abp/Validation/DynamicRangeAttribute.cs | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicRangeAttributeAdapter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicRangeAttributeAdapter.cs index f084c559ad..d3344c20f2 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicRangeAttributeAdapter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicRangeAttributeAdapter.cs @@ -17,8 +17,8 @@ namespace Volo.Abp.AspNetCore.Mvc.DataAnnotations IStringLocalizer stringLocalizer) : base(attribute, stringLocalizer) { - _min = Attribute.Minimum.ToString()?.ToString(CultureInfo.InvariantCulture); - _max = Attribute.Maximum.ToString()?.ToString(CultureInfo.InvariantCulture); + _min = Convert.ToString(Attribute.Minimum,CultureInfo.InvariantCulture); + _max = Convert.ToString(Attribute.Maximum,CultureInfo.InvariantCulture); } public override void AddValidation(ClientModelValidationContext context) @@ -26,9 +26,9 @@ 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-length-min", _min); - MergeAttribute(context.Attributes, "data-val-length-max", _max); + MergeAttribute(context.Attributes, "data-val-range", GetErrorMessage(context)); + MergeAttribute(context.Attributes, "data-val-range-min", _min); + MergeAttribute(context.Attributes, "data-val-range-max", _max); } public override string GetErrorMessage(ModelValidationContextBase validationContext) diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicRangeAttribute.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicRangeAttribute.cs index 2836987302..49c91f593e 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicRangeAttribute.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicRangeAttribute.cs @@ -27,9 +27,9 @@ namespace Volo.Abp.Validation } /// A type to get the values of the properties + /// The type of the range parameters. Must implement IComparable. /// The name of the public static property for the /// The name of the public static property for the - /// The type of the range parameters. Must implement IComparable. public DynamicRangeAttribute( [NotNull] Type sourceType, [NotNull] Type operandType, From b44247615d252913aeb1d28ab4934cf5cd66c521 Mon Sep 17 00:00:00 2001 From: wakuflair Date: Wed, 2 Sep 2020 11:28:11 +0800 Subject: [PATCH 024/116] pass requestData parameter to inputAction function --- .../datatables/datatables-extensions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js index 9a2052b267..abb10d48a4 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js @@ -231,7 +231,7 @@ (function () { datatables.createAjax = function (serverMethod, inputAction) { return function (requestData, callback, settings) { - var input = inputAction ? inputAction() : {}; + var input = inputAction ? inputAction(requestData) : {}; //Paging if (settings.oInit.paging) { From 38827fb699e2537babca607dbaa64bedd4cee6d3 Mon Sep 17 00:00:00 2001 From: Yuhang Ji Date: Wed, 2 Sep 2020 13:06:03 +0800 Subject: [PATCH 025/116] Update framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js Co-authored-by: maliming <6908465+maliming@users.noreply.github.com> --- .../datatables/datatables-extensions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js index abb10d48a4..8d85f6f6d8 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js @@ -231,7 +231,7 @@ (function () { datatables.createAjax = function (serverMethod, inputAction) { return function (requestData, callback, settings) { - var input = inputAction ? inputAction(requestData) : {}; + var input = inputAction ? inputAction(requestData, settings) : {}; //Paging if (settings.oInit.paging) { From 22204a2f479dbcef37db707de367a5b17f46a3d6 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Thu, 3 Sep 2020 17:45:32 +0300 Subject: [PATCH 026/116] feat: add interpolate utility fn to replace placeholders --- .../core/src/lib/tests/string-utils.spec.ts | 26 ++++++++++++++++++- .../core/src/lib/utils/string-utils.ts | 6 +++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/core/src/lib/tests/string-utils.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/string-utils.spec.ts index a0642e43ee..c2f7a3c601 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/string-utils.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/string-utils.spec.ts @@ -1,4 +1,4 @@ -import { createTokenParser } from '../utils/string-utils'; +import { createTokenParser, interpolate } from '../utils/string-utils'; describe('String Utils', () => { describe('#createTokenParser', () => { @@ -19,4 +19,28 @@ describe('String Utils', () => { }, ); }); + + describe('#interpolate', () => { + test.each` + text | params | expected + ${'This is {0} and {1} example.'} | ${['foo', 'bar']} | ${'This is foo and bar example.'} + ${'This is {1} and {0} example.'} | ${['foo', 'bar']} | ${'This is bar and foo example.'} + ${'This is {0} and {0} example.'} | ${['foo', 'bar']} | ${'This is foo and foo example.'} + ${'This is {1} and {1} example.'} | ${['foo', 'bar']} | ${'This is bar and bar example.'} + ${'This is "{0}" and "{1}" example.'} | ${['foo', 'bar']} | ${'This is foo and bar example.'} + ${"This is '{1}' and '{0}' example."} | ${['foo', 'bar']} | ${'This is bar and foo example.'} + ${'This is { 0 } and {0} example.'} | ${['foo', 'bar']} | ${'This is foo and foo example.'} + ${'This is {1} and { 1 } example.'} | ${['foo', 'bar']} | ${'This is bar and bar example.'} + ${'This is {0}, {3}, {1}, and {2} example.'} | ${['foo', 'bar', 'baz', 'qux']} | ${'This is foo, qux, bar, and baz example.'} + ${'This is {0} with 0 example.'} | ${['foo']} | ${'This is foo with 0 example.'} + ${'This is {0} and {1} example.'} | ${['foo']} | ${'This is foo and {1} example.'} + ${'This is {0} and {1} example.'} | ${[]} | ${'This is {0} and {1} example.'} + ${'This is {0} example.'} | ${[null]} | ${'This is {0} example.'} + `( + 'should return $expected when text is $text and params are $params', + ({ text, params, expected }) => { + expect(interpolate(text, params)).toBe(expected); + }, + ); + }); }); diff --git a/npm/ng-packs/packages/core/src/lib/utils/string-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/string-utils.ts index 00db697325..7404dceab7 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/string-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/string-utils.ts @@ -15,3 +15,9 @@ export function createTokenParser(format: string) { }, {} as Record); }; } + +export function interpolate(text: string, params: string[]) { + return text + .replace(/(['"]?\{\s*(\d+)\s*\}['"]?)/g, (_, match, digit) => params[digit] ?? match) + .replace(/\s+/g, ' '); +} From 28371a3ba429d53fadc37040bcfa436a5ebca1c8 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Thu, 3 Sep 2020 17:47:06 +0300 Subject: [PATCH 027/116] fix: use interpolate to replace localization tokens --- .../packages/core/src/lib/states/config.state.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/states/config.state.ts b/npm/ng-packs/packages/core/src/lib/states/config.state.ts index 2aaf7a3bc2..ec9ccd6749 100644 --- a/npm/ng-packs/packages/core/src/lib/states/config.state.ts +++ b/npm/ng-packs/packages/core/src/lib/states/config.state.ts @@ -9,6 +9,7 @@ import { RestOccurError } from '../actions/rest.actions'; import { SetLanguage } from '../actions/session.actions'; import { ApplicationConfiguration } from '../models/application-configuration'; import { Config } from '../models/config'; +import { interpolate } from '../utils/string-utils'; import { SessionState } from './session.state'; @State({ @@ -180,14 +181,12 @@ export class ConfigState { return defaultValue || sourceKey; } + // [TODO]: next line should be removed in v3.2, breaking change!!! interpolateParams = interpolateParams.filter(params => params != null); - if (localization && interpolateParams && interpolateParams.length) { - interpolateParams.forEach(param => { - localization = localization.replace(/[\'\"]?\{[\d]+\}[\'\"]?/, param); - }); - } + if (localization) localization = interpolate(localization, interpolateParams); if (typeof localization !== 'string') localization = ''; + return localization || defaultValue || (key as string); }); From b37f7fab934a99d785c76a084b3af11da605e386 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 4 Sep 2020 12:25:57 +0300 Subject: [PATCH 028/116] Add api-name parameter to the generate-proxy command. --- docs/en/CLI.md | 2 ++ .../Volo/Abp/Cli/Commands/ProxyCommandBase.cs | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/docs/en/CLI.md b/docs/en/CLI.md index e6e7fcccf8..36f3b8e105 100644 --- a/docs/en/CLI.md +++ b/docs/en/CLI.md @@ -191,6 +191,7 @@ abp generate-proxy #### Options * `--module` or `-m`: Specifies the name of the backend module you wish to generate proxies for. Default value: `app`. +* `--api-name` or `-a`: The name of the API endpoint defined in the `/src/environments/environment.ts`. Default value: `default`. * `--source` or `-s`: Specifies the Angular project name to resolve the root namespace & API definition URL from. Default value: `defaultProject`. * `--target` or `-t`: Specifies the Angular project name to place generated code in. Default value: `defaultProject`. * `--prompt` or `-p`: Asks the options from the command line prompt (for the unspecified options). @@ -212,6 +213,7 @@ abp remove-proxy #### Options * `--module` or `-m`: Specifies the name of the backend module you wish to remove proxies for. Default value: `app`. +* `--api-name` or `-a`: The name of the API endpoint defined in the `/src/environments/environment.ts`. Default value: `default`. * `--source` or `-s`: Specifies the Angular project name to resolve the root namespace & API definition URL from. Default value: `defaultProject`. * `--target` or `-t`: Specifies the Angular project name to place generated code in. Default value: `defaultProject`. * `--prompt` or `-p`: Asks the options from the command line prompt (for the unspecified options). diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProxyCommandBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProxyCommandBase.cs index 0116c809cb..7898ae7abc 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProxyCommandBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProxyCommandBase.cs @@ -24,6 +24,7 @@ namespace Volo.Abp.Cli.Commands var defaultValue = prompt ? null : "__default"; var module = commandLineArgs.Options.GetOrNull(Options.Module.Short, Options.Module.Long) ?? defaultValue; + var apiName = commandLineArgs.Options.GetOrNull(Options.ApiName.Short, Options.ApiName.Long) ?? defaultValue; var source = commandLineArgs.Options.GetOrNull(Options.Source.Short, Options.Source.Long) ?? defaultValue; var target = commandLineArgs.Options.GetOrNull(Options.Target.Short, Options.Target.Long) ?? defaultValue; @@ -34,6 +35,11 @@ namespace Volo.Abp.Cli.Commands commandBuilder.Append($" --module {module}"); } + if (apiName != null) + { + commandBuilder.Append($" --api-name {apiName}"); + } + if (source != null) { commandBuilder.Append($" --source {source}"); @@ -100,6 +106,7 @@ namespace Volo.Abp.Cli.Commands sb.AppendLine("Options:"); sb.AppendLine(""); sb.AppendLine("-m|--module (default: 'app') The name of the backend module you wish to generate proxies for."); + sb.AppendLine("-a|--api-name (default: 'default') The name of the API endpoint defined in the /src/environments/environment.ts."); sb.AppendLine("-s|--source (default: 'defaultProject') Angular project name to resolve the root namespace & API definition URL from."); sb.AppendLine("-t|--target (default: 'defaultProject') Angular project name to place generated code in."); sb.AppendLine("-p|--prompt Asks the options from the command line prompt (for the missing options)"); @@ -122,6 +129,12 @@ namespace Volo.Abp.Cli.Commands public const string Long = "module"; } + public static class ApiName + { + public const string Short = "a"; + public const string Long = "api-name"; + } + public static class Source { public const string Short = "s"; From 1bc7f7f8a9559d7f61a9dffe36e0dffe96f5d357 Mon Sep 17 00:00:00 2001 From: Bunyamin Coskuner Date: Fri, 4 Sep 2020 13:48:15 +0300 Subject: [PATCH 029/116] docs: fix bold environment word --- docs/en/UI/Angular/Environment.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/UI/Angular/Environment.md b/docs/en/UI/Angular/Environment.md index 86978cfa16..402e110f94 100644 --- a/docs/en/UI/Angular/Environment.md +++ b/docs/en/UI/Angular/Environment.md @@ -1,6 +1,6 @@ # Environment -Every application needs some ** environment ** variables. In Angular world, this is usually managed by `environment.ts`, `environment.prod.ts` and so on. It is the same for ABP as well. +Every application needs some **environment** variables. In Angular world, this is usually managed by `environment.ts`, `environment.prod.ts` and so on. It is the same for ABP as well. Current `Environment` configuration holds sub config classes as follows: From f540ed503f5a7c140b9b5abd71dbb3a66cd0e79e Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Fri, 4 Sep 2020 14:00:56 +0300 Subject: [PATCH 030/116] fix: skip property if ref is same as interface ref --- npm/ng-packs/packages/schematics/src/utils/model.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/schematics/src/utils/model.ts b/npm/ng-packs/packages/schematics/src/utils/model.ts index 2ac5949050..0e472e64d3 100644 --- a/npm/ng-packs/packages/schematics/src/utils/model.ts +++ b/npm/ng-packs/packages/schematics/src/utils/model.ts @@ -133,7 +133,11 @@ export function createImportRefToInterfaceReducerCreator(params: ModelGeneratorP return _interface.properties .reduce((refs, prop) => { - prop.refs.forEach(type => !types[type]?.isEnum && refs.push(type)); + prop.refs.forEach(type => { + if (types[type]?.isEnum || type === _interface.ref) return; + refs.push(type); + }); + return refs; }, []) .concat(base ? parseGenerics(typeDef.baseType!).toGenerics() : []) From fd3b79395ed6c9e05733a18c88be647b4a15537e Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Fri, 4 Sep 2020 17:07:02 +0300 Subject: [PATCH 031/116] Remote exceptions localization data --- .../DefaultExceptionToErrorInfoConverter.cs | 7 ++- .../Abp/Http/Client/AbpRemoteCallException.cs | 8 +++ .../Volo/Abp/Http/RemoteServiceErrorInfo.cs | 6 +- .../Volo/Abp/Identity/Localization/en.json | 56 +++++++++---------- .../Volo/Abp/Identity/Localization/tr.json | 56 +++++++++---------- .../Identity/AbpIdentityResultExtensions.cs | 41 +++++++++++++- .../Identity/AbpIdentityResultException.cs | 9 ++- 7 files changed, 120 insertions(+), 63 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/ExceptionHandling/DefaultExceptionToErrorInfoConverter.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/ExceptionHandling/DefaultExceptionToErrorInfoConverter.cs index cd2f393104..339b249e49 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/ExceptionHandling/DefaultExceptionToErrorInfoConverter.cs +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/ExceptionHandling/DefaultExceptionToErrorInfoConverter.cs @@ -72,7 +72,7 @@ namespace Volo.Abp.AspNetCore.ExceptionHandling } var errorInfo = new RemoteServiceErrorInfo(); - + if (exception is IUserFriendlyException) { errorInfo.Message = exception.Message; @@ -101,6 +101,8 @@ namespace Volo.Abp.AspNetCore.ExceptionHandling errorInfo.Message = L["InternalServerErrorMessage"]; } + errorInfo.Data = exception.Data; + return errorInfo; } @@ -190,7 +192,6 @@ namespace Volo.Abp.AspNetCore.ExceptionHandling return exception; } - protected virtual RemoteServiceErrorInfo CreateDetailedErrorInfoFromException(Exception exception) { var detailBuilder = new StringBuilder(); @@ -213,7 +214,7 @@ namespace Volo.Abp.AspNetCore.ExceptionHandling detailBuilder.AppendLine(exception.GetType().Name + ": " + exception.Message); //Additional info for UserFriendlyException - if (exception is IUserFriendlyException && + if (exception is IUserFriendlyException && exception is IHasErrorDetails) { var details = ((IHasErrorDetails) exception).Details; diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpRemoteCallException.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpRemoteCallException.cs index d5cbc10c0b..71966868f9 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpRemoteCallException.cs +++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpRemoteCallException.cs @@ -28,6 +28,14 @@ namespace Volo.Abp.Http.Client : base(error.Message) { Error = error; + + if (error?.Data != null) + { + foreach (var dataKey in error.Data.Keys) + { + Data[dataKey] = error.Data[dataKey]; + } + } } } } diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/RemoteServiceErrorInfo.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/RemoteServiceErrorInfo.cs index 25792d1b24..287b423c20 100644 --- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/RemoteServiceErrorInfo.cs +++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/RemoteServiceErrorInfo.cs @@ -1,4 +1,6 @@ using System; +using System.Collections; +using System.Collections.Generic; namespace Volo.Abp.Http { @@ -23,6 +25,8 @@ namespace Volo.Abp.Http /// public string Details { get; set; } + public IDictionary Data { get; set; } + /// /// Validation errors if exists. /// @@ -49,4 +53,4 @@ namespace Volo.Abp.Http Code = code; } } -} \ No newline at end of file +} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json index 6d8a5c58c5..8259e1abb2 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json @@ -35,34 +35,34 @@ "DisplayName:NewPasswordConfirm": "Confirm new password", "PasswordChangedMessage": "Your password has been changed successfully.", "PersonalSettingsSavedMessage": "Your personal settings has been saved successfully.", - "Identity.DefaultError": "An unknown failure has occurred.", - "Identity.ConcurrencyFailure": "Optimistic concurrency failure, object has been modified.", - "Identity.DuplicateEmail": "Email '{0}' is already taken.", - "Identity.DuplicateRoleName": "Role name '{0}' is already taken.", - "Identity.DuplicateUserName": "User name '{0}' is already taken.", - "Identity.InvalidEmail": "Email '{0}' is invalid.", - "Identity.InvalidPasswordHasherCompatibilityMode": "The provided PasswordHasherCompatibilityMode is invalid.", - "Identity.InvalidPasswordHasherIterationCount": "The iteration count must be a positive integer.", - "Identity.InvalidRoleName": "Role name '{0}' is invalid.", - "Identity.InvalidToken": "Invalid token.", - "Identity.InvalidUserName": "User name '{0}' is invalid, can only contain letters or digits.", - "Identity.LoginAlreadyAssociated": "A user with this login already exists.", - "Identity.PasswordMismatch": "Incorrect password.", - "Identity.PasswordRequiresDigit": "Passwords must have at least one digit ('0'-'9').", - "Identity.PasswordRequiresLower": "Passwords must have at least one lowercase ('a'-'z').", - "Identity.PasswordRequiresNonAlphanumeric": "Passwords must have at least one non alphanumeric character.", - "Identity.PasswordRequiresUpper": "Passwords must have at least one uppercase ('A'-'Z').", - "Identity.PasswordTooShort": "Passwords must be at least {0} characters.", - "Identity.RoleNotFound": "Role {0} does not exist.", - "Identity.UserAlreadyHasPassword": "User already has a password set.", - "Identity.UserAlreadyInRole": "User already in role '{0}'.", - "Identity.UserLockedOut": "User is locked out.", - "Identity.UserLockoutNotEnabled": "Lockout is not enabled for this user.", - "Identity.UserNameNotFound": "User {0} does not exist.", - "Identity.UserNotInRole": "User is not in role '{0}'.", - "Identity.PasswordConfirmationFailed": "Password does not match the confirm password.", - "Identity.StaticRoleRenamingErrorMessage": "Static roles can not be renamed.", - "Identity.StaticRoleDeletionErrorMessage": "Static roles can not be deleted.", + "Volo.Abp.Identity:DefaultError": "An unknown failure has occurred.", + "Volo.Abp.Identity:ConcurrencyFailure": "Optimistic concurrency failure, object has been modified.", + "Volo.Abp.Identity:DuplicateEmail": "Email '{0}' is already taken.", + "Volo.Abp.Identity:DuplicateRoleName": "Role name '{0}' is already taken.", + "Volo.Abp.Identity:DuplicateUserName": "User name '{0}' is already taken.", + "Volo.Abp.Identity:InvalidEmail": "Email '{0}' is invalid.", + "Volo.Abp.Identity:InvalidPasswordHasherCompatibilityMode": "The provided PasswordHasherCompatibilityMode is invalid.", + "Volo.Abp.Identity:InvalidPasswordHasherIterationCount": "The iteration count must be a positive integer.", + "Volo.Abp.Identity:InvalidRoleName": "Role name '{0}' is invalid.", + "Volo.Abp.Identity:InvalidToken": "Invalid token.", + "Volo.Abp.Identity:InvalidUserName": "User name '{0}' is invalid, can only contain letters or digits.", + "Volo.Abp.Identity:LoginAlreadyAssociated": "A user with this login already exists.", + "Volo.Abp.Identity:PasswordMismatch": "Incorrect password.", + "Volo.Abp.Identity:PasswordRequiresDigit": "Passwords must have at least one digit ('0'-'9').", + "Volo.Abp.Identity:PasswordRequiresLower": "Passwords must have at least one lowercase ('a'-'z').", + "Volo.Abp.Identity:PasswordRequiresNonAlphanumeric": "Passwords must have at least one non alphanumeric character.", + "Volo.Abp.Identity:PasswordRequiresUpper": "Passwords must have at least one uppercase ('A'-'Z').", + "Volo.Abp.Identity:PasswordTooShort": "Passwords must be at least {0} characters.", + "Volo.Abp.Identity:RoleNotFound": "Role {0} does not exist.", + "Volo.Abp.Identity:UserAlreadyHasPassword": "User already has a password set.", + "Volo.Abp.Identity:UserAlreadyInRole": "User already in role '{0}'.", + "Volo.Abp.Identity:UserLockedOut": "User is locked out.", + "Volo.Abp.Identity:UserLockoutNotEnabled": "Lockout is not enabled for this user.", + "Volo.Abp.Identity:UserNameNotFound": "User {0} does not exist.", + "Volo.Abp.Identity:UserNotInRole": "User is not in role '{0}'.", + "Volo.Abp.Identity:PasswordConfirmationFailed": "Password does not match the confirm password.", + "Volo.Abp.Identity:StaticRoleRenamingErrorMessage": "Static roles can not be renamed.", + "Volo.Abp.Identity:StaticRoleDeletionErrorMessage": "Static roles can not be deleted.", "Identity.OrganizationUnit.DuplicateDisplayNameWarning": "There is already an organization unit with name {0}. Two units with same name can not be created in same level.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Maximum allowed organization unit membership count for a user", "Volo.Abp.Identity:010001": "You can not delete your own account!", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json index 0b17e51276..b270f344ef 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json @@ -35,34 +35,34 @@ "DisplayName:NewPasswordConfirm": "Yeni şifre (tekrar)", "PasswordChangedMessage": "Şifreniz başarıyla değiştirildi.", "PersonalSettingsSavedMessage": "Kişisel bilgileriniz başarıyla kaydedildi.", - "Identity.StaticRoleRenamingErrorMessage": "Bir Sabit rolün ismi değiştirilemez.", - "Identity.StaticRoleDeletionErrorMessage": "Bir Sabit rol silinemez.", - "Identity.DefaultError": "Bilinmeyen bir hata oluştu.", - "Identity.ConcurrencyFailure": "İyimser eşzamanlılık hatası. Nesne değiştirilmiş.", - "Identity.DuplicateEmail": "'{0}' email adresi zaten alınmış.", - "Identity.DuplicateRoleName": "'{0}' rol ismi zaten alınmış.", - "Identity.DuplicateUserName": "'{0}' kullanıcı adı zaten alınmış.", - "Identity.InvalidEmail": "'{0}' email adresi hatalı.", - "Identity.InvalidPasswordHasherCompatibilityMode": "Belirtilen PasswordHasherCompatibilityMode geçersiz.", - "Identity.InvalidPasswordHasherIterationCount": "Iterasyon sayısı sıfırdan büyük bir sayı olmalı.", - "Identity.InvalidRoleName": "'{0}' rol ismi geçersizdir.", - "Identity.InvalidToken": "Geçersiz token.", - "Identity.InvalidUserName": "'{0}' kullanıcı adı geçersiz, sadece harf ve rakamlardan oluşmalı.", - "Identity.LoginAlreadyAssociated": "Bu giriş bilgilerine sahip bir kullanıcı zaten var.", - "Identity.PasswordMismatch": "Hatalı şifre.", - "Identity.PasswordRequiresDigit": "Şifre en az bir sayı içermeli ('0'-'9').", - "Identity.PasswordRequiresLower": "Şifre en az bir küçük harf içermeli ('a'-'z').", - "Identity.PasswordRequiresNonAlphanumeric": "Şifre en az bir sayı ya da harf olmayan karakter içermeli.", - "Identity.PasswordRequiresUpper": "Şifre en az bir büyük harf içermeli ('A'-'Z').", - "Identity.PasswordTooShort": "Şifre en az {0} karakter uzunluğunda olmalı.", - "Identity.RoleNotFound": "{0} rolü bulunamadı.", - "Identity.UserAlreadyHasPassword": "Kullanıcının zaten bir şifresi var.", - "Identity.UserAlreadyInRole": "Kullanıcı zaten '{0}' rolünde.", - "Identity.UserLockedOut": "Kullanıcı hesabı kilitlenmiş.", - "Identity.UserLockoutNotEnabled": "Bu kullanıcı için hesap kilitleme etkin değil.", - "Identity.UserNameNotFound": "{0} kullanıcısı bulunamadı.", - "Identity.UserNotInRole": "Kullanıcı '{0}' rolünde değil.", - "Identity.PasswordConfirmationFailed": "Yeni şifre ile onay şifresi uyuşmuyor.", + "Volo.Abp.Identity:StaticRoleRenamingErrorMessage": "Bir Sabit rolün ismi değiştirilemez.", + "Volo.Abp.Identity:StaticRoleDeletionErrorMessage": "Bir Sabit rol silinemez.", + "Volo.Abp.Identity:DefaultError": "Bilinmeyen bir hata oluştu.", + "Volo.Abp.Identity:ConcurrencyFailure": "İyimser eşzamanlılık hatası. Nesne değiştirilmiş.", + "Volo.Abp.Identity:DuplicateEmail": "'{0}' email adresi zaten alınmış.", + "Volo.Abp.Identity:DuplicateRoleName": "'{0}' rol ismi zaten alınmış.", + "Volo.Abp.Identity:DuplicateUserName": "'{0}' kullanıcı adı zaten alınmış.", + "Volo.Abp.Identity:InvalidEmail": "'{0}' email adresi hatalı.", + "Volo.Abp.Identity:InvalidPasswordHasherCompatibilityMode": "Belirtilen PasswordHasherCompatibilityMode geçersiz.", + "Volo.Abp.Identity:InvalidPasswordHasherIterationCount": "Iterasyon sayısı sıfırdan büyük bir sayı olmalı.", + "Volo.Abp.Identity:InvalidRoleName": "'{0}' rol ismi geçersizdir.", + "Volo.Abp.Identity:InvalidToken": "Geçersiz token.", + "Volo.Abp.Identity:InvalidUserName": "'{0}' kullanıcı adı geçersiz, sadece harf ve rakamlardan oluşmalı.", + "Volo.Abp.Identity:LoginAlreadyAssociated": "Bu giriş bilgilerine sahip bir kullanıcı zaten var.", + "Volo.Abp.Identity:PasswordMismatch": "Hatalı şifre.", + "Volo.Abp.Identity:PasswordRequiresDigit": "Şifre en az bir sayı içermeli ('0'-'9').", + "Volo.Abp.Identity:PasswordRequiresLower": "Şifre en az bir küçük harf içermeli ('a'-'z').", + "Volo.Abp.Identity:PasswordRequiresNonAlphanumeric": "Şifre en az bir sayı ya da harf olmayan karakter içermeli.", + "Volo.Abp.Identity:PasswordRequiresUpper": "Şifre en az bir büyük harf içermeli ('A'-'Z').", + "Volo.Abp.Identity:PasswordTooShort": "Şifre en az {0} karakter uzunluğunda olmalı.", + "Volo.Abp.Identity:RoleNotFound": "{0} rolü bulunamadı.", + "Volo.Abp.Identity:UserAlreadyHasPassword": "Kullanıcının zaten bir şifresi var.", + "Volo.Abp.Identity:UserAlreadyInRole": "Kullanıcı zaten '{0}' rolünde.", + "Volo.Abp.Identity:UserLockedOut": "Kullanıcı hesabı kilitlenmiş.", + "Volo.Abp.Identity:UserLockoutNotEnabled": "Bu kullanıcı için hesap kilitleme etkin değil.", + "Volo.Abp.Identity:UserNameNotFound": "{0} kullanıcısı bulunamadı.", + "Volo.Abp.Identity:UserNotInRole": "Kullanıcı '{0}' rolünde değil.", + "Volo.Abp.Identity:PasswordConfirmationFailed": "Yeni şifre ile onay şifresi uyuşmuyor.", "Identity.OrganizationUnit.DuplicateDisplayNameWarning": "{0} isminde bir birim zaten var. Aynı seviyede aynı isimli iki birim olamaz.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Bir kullanıcı için izin verilen en fazla organizasyon birimi sayısı", "Volo.Abp.Identity:010001": "Kendi hesabınızı silemezsiniz!", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Microsoft/AspNetCore/Identity/AbpIdentityResultExtensions.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Microsoft/AspNetCore/Identity/AbpIdentityResultExtensions.cs index 0ef3582af1..f71f8f76e9 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Microsoft/AspNetCore/Identity/AbpIdentityResultExtensions.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Microsoft/AspNetCore/Identity/AbpIdentityResultExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Linq; using System.Collections.Generic; using System.Globalization; @@ -26,6 +27,41 @@ namespace Microsoft.AspNetCore.Identity throw new AbpIdentityResultException(identityResult); } + public static string[] GetValuesFromErrorMessage(this IdentityResult identityResult, IStringLocalizer localizer) + { + if (identityResult.Succeeded) + { + throw new ArgumentException( + "identityResult.Succeeded should be false in order to get values from error."); + } + + if (identityResult.Errors == null) + { + throw new ArgumentException("identityResult.Errors should not be null."); + } + + var error = identityResult.Errors.First(); + var key = $"Volo.Abp.Identity:{error.Code}"; + + using (CultureHelper.Use(CultureInfo.GetCultureInfo("en"))) + { + var englishLocalizedString = localizer[key]; + + if (englishLocalizedString.ResourceNotFound) + { + return Array.Empty(); + } + + if (FormattedStringValueExtracter.IsMatch(error.Description, englishLocalizedString.Value, + out var values)) + { + return values; + } + + return Array.Empty(); + } + } + public static string LocalizeErrors(this IdentityResult identityResult, IStringLocalizer localizer) { if (identityResult.Succeeded) @@ -43,7 +79,7 @@ namespace Microsoft.AspNetCore.Identity public static string LocalizeErrorMessage(this IdentityError error, IStringLocalizer localizer) { - var key = $"Identity.{error.Code}"; + var key = $"Volo.Abp.Identity:{error.Code}"; var localizedString = localizer[key]; @@ -54,7 +90,8 @@ namespace Microsoft.AspNetCore.Identity var englishLocalizedString = localizer[key]; if (!englishLocalizedString.ResourceNotFound) { - if (FormattedStringValueExtracter.IsMatch(error.Description, englishLocalizedString.Value, out var values)) + if (FormattedStringValueExtracter.IsMatch(error.Description, englishLocalizedString.Value, + out var values)) { return string.Format(localizedString.Value, values.Cast().ToArray()); } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityResultException.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityResultException.cs index de02081a1d..b608720576 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityResultException.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityResultException.cs @@ -18,7 +18,7 @@ namespace Volo.Abp.Identity public AbpIdentityResultException([NotNull] IdentityResult identityResult) : base( - code: $"Identity.{identityResult.Errors.First().Code}", + code: $"Volo.Abp.Identity:{identityResult.Errors.First().Code}", message: identityResult.Errors.Select(err => err.Description).JoinAsString(", ")) { IdentityResult = Check.NotNull(identityResult, nameof(identityResult)); @@ -32,6 +32,13 @@ namespace Volo.Abp.Identity public virtual string LocalizeMessage(LocalizationContext context) { + var values = IdentityResult.GetValuesFromErrorMessage(context.LocalizerFactory.Create()); + + for (var index = 0; index < values.Length; index++) + { + Data[index.ToString()] = values[index]; + } + return IdentityResult.LocalizeErrors(context.LocalizerFactory.Create()); } } From ca74431f4355ec16fb37df7380a8bd4e858961d0 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 02:04:02 +0300 Subject: [PATCH 032/116] ci: add cache process to angular action --- .github/workflows/angular.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/angular.yml b/.github/workflows/angular.yml index 1b4d37bd39..b0d6e413e4 100644 --- a/.github/workflows/angular.yml +++ b/.github/workflows/angular.yml @@ -9,6 +9,14 @@ jobs: runs-on: ubuntu-18.04 steps: - uses: actions/checkout@v1 + + - uses: actions/cache@v2 + with: + path: | + node_modules + */*/node_modules + key: ${{ runner.os }}-${{ hashFiles('**/yarn.lock') }} + - uses: actions/setup-node@v1 with: node-version: '12.x' From b9a9d86bcf9ee8b35c5c05ca06d40150de9c855a Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 02:07:27 +0300 Subject: [PATCH 033/116] chore: update angular.yml --- .github/workflows/angular.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/angular.yml b/.github/workflows/angular.yml index b0d6e413e4..52aaa57b98 100644 --- a/.github/workflows/angular.yml +++ b/.github/workflows/angular.yml @@ -12,9 +12,7 @@ jobs: - uses: actions/cache@v2 with: - path: | - node_modules - */*/node_modules + path: '**/node_modules' key: ${{ runner.os }}-${{ hashFiles('**/yarn.lock') }} - uses: actions/setup-node@v1 From a3aa39153bb0acafb266b6519af187d213d7968d Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 02:07:40 +0300 Subject: [PATCH 034/116] chore: update yarn.lock --- npm/ng-packs/yarn.lock | 1058 ++++++++++++++-------------------------- 1 file changed, 365 insertions(+), 693 deletions(-) diff --git a/npm/ng-packs/yarn.lock b/npm/ng-packs/yarn.lock index 5739a50274..512eb7d30b 100644 --- a/npm/ng-packs/yarn.lock +++ b/npm/ng-packs/yarn.lock @@ -2,20 +2,20 @@ # yarn lockfile v1 -"@abp/ng.account@~3.1.0-rc.4": - version "3.1.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/ng.account/-/ng.account-3.1.0-rc.4.tgz#af4039b286fe44929327e93dba9991cb273d5336" - integrity sha512-wYkSz1HlPwMPUMAfCe404LCb15ZDEV5GfNIZuHeyiNtC/AcvqZEbBBpM2xMZ3uMcvxH/72IrLFBpxemCY+6euw== +"@abp/ng.account@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@abp/ng.account/-/ng.account-3.1.0.tgz#cd5fb46dffd7455188c10769220ed58806f455fa" + integrity sha512-/v+yyagHIUhjpJ1exzubf54XQBsgO2o3r3bFJFlWqzJoeCLufzyyppqK2UQ+6sQ7CjWP5jFCqo87R9myNn2xHA== dependencies: - "@abp/ng.theme.shared" "~3.1.0-rc.4" + "@abp/ng.theme.shared" "~3.1.0" tslib "^2.0.0" -"@abp/ng.core@~3.1.0-rc.4": - version "3.1.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/ng.core/-/ng.core-3.1.0-rc.4.tgz#cc0d237de4de5eac6006d1cdd2bb4014a7ecebb8" - integrity sha512-H/kC8dLvbdHS/cEh2GHWw3vjjN2R5P0eAz+2bhC18kW/EQo6EgNckTbhgvYre9FtJPHbT2Prs1v1CWe1lB5Rnw== +"@abp/ng.core@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@abp/ng.core/-/ng.core-3.1.0.tgz#aba988fd915a633ea7af3a68278cc2557a37446f" + integrity sha512-SRRA7MYh12irJMRCj9emE5hyw+5aeiETlohP1CdgpdhhT3/RSPwrSeZNGJU0ilk6tKoO2rcZT6fgGjhqQfMyOw== dependencies: - "@abp/utils" "^3.1.0-rc.3" + "@abp/utils" "^3.1.0-rc.4" "@angular/localize" "~10.0.10" "@ngxs/router-plugin" "^3.6.2" "@ngxs/storage-plugin" "^3.6.2" @@ -27,35 +27,35 @@ ts-toolbelt "6.15.4" tslib "^2.0.0" -"@abp/ng.feature-management@~3.1.0-rc.4": - version "3.1.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/ng.feature-management/-/ng.feature-management-3.1.0-rc.4.tgz#d9a85fbe8a780664c9474df9b0d2fe6874530781" - integrity sha512-y3xUFJSHmBCBivE6YRgUgA/XK/jIX1h+JdIsVwRQg9VoKq4Ba7xSF1uffYkbiZhELv9lUZ4t+r100nL64yj/kQ== +"@abp/ng.feature-management@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@abp/ng.feature-management/-/ng.feature-management-3.1.0.tgz#a93b0d63dc542e3880a1c79ac1e630b2db19b8bf" + integrity sha512-CayqVZ8XJQXsmz+IU+OchXK/vl01x6DHA/oTpvkW9HM2kYYJ8dmD940kjr5i3ZX6WF2Q4yTc+wLgZhGQt7eK9Q== dependencies: - "@abp/ng.theme.shared" "~3.1.0-rc.4" + "@abp/ng.theme.shared" "~3.1.0" tslib "^2.0.0" -"@abp/ng.identity@~3.1.0-rc.4": - version "3.1.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/ng.identity/-/ng.identity-3.1.0-rc.4.tgz#6f04d8231fce78ee3a2de387e81aade5ac3fa9a3" - integrity sha512-mRI6uZ0PlbDhNNX1BGYECN5fDPyENnpudbo09SMSVGK99BSa+pJAvOMLWQTp8WJuo/C8kl/Mz17cAhp/EirgYQ== +"@abp/ng.identity@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@abp/ng.identity/-/ng.identity-3.1.0.tgz#d3086dd887c7ea2786e4c8620b3448333065053a" + integrity sha512-G4CToeEou4Zwr4NkpauwMKJme61lofd77PycWvFPVJ8Df6EctmxJc+u6NVgG7+ZjuFI+oTQrLwCEl3uPuznnpA== dependencies: - "@abp/ng.permission-management" "~3.1.0-rc.4" - "@abp/ng.theme.shared" "~3.1.0-rc.4" + "@abp/ng.permission-management" "~3.1.0" + "@abp/ng.theme.shared" "~3.1.0" tslib "^2.0.0" -"@abp/ng.permission-management@~3.1.0-rc.4": - version "3.1.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/ng.permission-management/-/ng.permission-management-3.1.0-rc.4.tgz#b0415fc62ecfc03b57810e6a82fadeec887b64e4" - integrity sha512-/U5ehBn1dQYGcy++/EtciUlz69+WZ+ZXbxJ3MF7cNNy7BwZCyjKc7my2Uh2HrP+Ce3q1h11obX15KpB7uCggCg== +"@abp/ng.permission-management@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@abp/ng.permission-management/-/ng.permission-management-3.1.0.tgz#c0a9a135699b7c8a329c0c9ac839cde06dce3db2" + integrity sha512-u3JwxK1vAlqC6YBVqnyP26FZqArrIQn94fZ/Vm6n9rjId7VaJbA0UrX9d2YAwKROKOpAnBNc5GA0A2gaWIO9rg== dependencies: - "@abp/ng.theme.shared" "~3.1.0-rc.4" + "@abp/ng.theme.shared" "~3.1.0" tslib "^2.0.0" -"@abp/ng.schematics@~3.1.0-rc.4": - version "3.1.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/ng.schematics/-/ng.schematics-3.1.0-rc.4.tgz#9f711466db0d46eb08ff14a19e930dbd7cb6aa59" - integrity sha512-nn94E2JB0N5pcDNCh1JtyHV/ZhAnG+d+wKGzhZSOFEWZvPOREQs1OI4aKrBF94DYWy8yWxKZtPWEMwkmX+yXMg== +"@abp/ng.schematics@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@abp/ng.schematics/-/ng.schematics-3.1.0.tgz#ea7dd6d7dfd02425e7eff25c7e350614a4c0cad8" + integrity sha512-Vn0G6Wi+/JJ7vFgSkt5sRtdWBWdBQSncwH+kI2O1F0GvhJTrf1eDQ8XTk2yZiOD8oFLgt8mnJzTVzJbs3RqR+Q== dependencies: "@angular-devkit/core" "~10.0.3" "@angular-devkit/schematics" "~10.0.3" @@ -63,37 +63,37 @@ jsonc-parser "^2.3.0" typescript "~3.9.2" -"@abp/ng.setting-management@~3.1.0-rc.4": - version "3.1.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/ng.setting-management/-/ng.setting-management-3.1.0-rc.4.tgz#777b8487e6b6811c28375bf695d6db96ca59cc28" - integrity sha512-Mwx5nILDdqT7aEktv0gK1wxhtNuD9W67dlIcunwD/YD60hwAnRX3yFeg1aDHVF70EykY9UMerBGAG3J2Loclhg== +"@abp/ng.setting-management@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@abp/ng.setting-management/-/ng.setting-management-3.1.0.tgz#eebb1c7bdfd75a04cba4c1f8d0f5cfc306a64f43" + integrity sha512-jPBn9vpDHqCDscyo445MWdCd/C0pR+WEnXPxCu7lCOs+ry1n16etoWuLAIfI2LtpI0+g8AgMyL3hacP0MPzpGg== dependencies: - "@abp/ng.theme.shared" "~3.1.0-rc.4" + "@abp/ng.theme.shared" "~3.1.0" tslib "^2.0.0" -"@abp/ng.tenant-management@~3.1.0-rc.4": - version "3.1.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management/-/ng.tenant-management-3.1.0-rc.4.tgz#c8ad9a927045599bec309408b3cdd741935fac7f" - integrity sha512-DK5J0FjA9fR1crvaNa6o5WPjS8/8cDij65GHJb1RzXm8ZfpNoXlcZEUv3MXBJt4zIU3l5ZTDSH3skmNQaobosg== +"@abp/ng.tenant-management@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management/-/ng.tenant-management-3.1.0.tgz#d0b58b711269d91530f36f8ddcb3f6d8f80c0927" + integrity sha512-//g3O2b2NvV7NQtEydbrhZqkdyS3FccVs6wX204ylTLCaLDAwneqNnAnSCQHnUI9GNMjBpj3/VFRGBlvGeW+tw== dependencies: - "@abp/ng.feature-management" "~3.1.0-rc.4" - "@abp/ng.theme.shared" "~3.1.0-rc.4" + "@abp/ng.feature-management" "~3.1.0" + "@abp/ng.theme.shared" "~3.1.0" tslib "^2.0.0" -"@abp/ng.theme.basic@~3.1.0-rc.4": - version "3.1.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/ng.theme.basic/-/ng.theme.basic-3.1.0-rc.4.tgz#36a627ab520046f5978ec60ae9c03b723a879b66" - integrity sha512-SJmc1KrLc3K1Njf+0UUXHB/ABdVbzIzYKT8GbCf0E/Nw6KgVufIpB+g92rqxkeqG9jKEASAnSomYRJeMJJ3bVQ== +"@abp/ng.theme.basic@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@abp/ng.theme.basic/-/ng.theme.basic-3.1.0.tgz#53db1e40ed4bf34d2efdc4a990ce9838f61b8d5e" + integrity sha512-C2yXYoSApLzUaOiLAAfFGEkAAP59KHJXaJTG2tsyGAsf+H2yFp2sQW+R0i59opmhW3LUXpAZV9aHKk++w+CGcQ== dependencies: - "@abp/ng.theme.shared" "~3.1.0-rc.4" + "@abp/ng.theme.shared" "~3.1.0" tslib "^2.0.0" -"@abp/ng.theme.shared@~3.1.0-rc.4": - version "3.1.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/ng.theme.shared/-/ng.theme.shared-3.1.0-rc.4.tgz#516a9d65229b1ddd1891edad8c1bd45ca3729228" - integrity sha512-wfMZSO0fwKDphAq8fWwvd7gxybY4LzQJNZdWYbBg12ePzXzRYCxxDg4xLzUetFYZQS+xSA9xoyGuCR8WT2OQEg== +"@abp/ng.theme.shared@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@abp/ng.theme.shared/-/ng.theme.shared-3.1.0.tgz#12fc8fb84b27c74603945dc5384afcf62bb985b6" + integrity sha512-cknvClcDbaCrfTagNuojRbOG88NYCLDEPOOrXdTcSKfieJM2L7w/Ku2piqneV17CCM51Ce7Tl1BO7osYtxTS9Q== dependencies: - "@abp/ng.core" "~3.1.0-rc.4" + "@abp/ng.core" "~3.1.0" "@fortawesome/fontawesome-free" "^5.14.0" "@ng-bootstrap/ng-bootstrap" "^7.0.0" "@ngx-validate/core" "^0.0.11" @@ -102,17 +102,10 @@ chart.js "^2.9.3" tslib "^2.0.0" -"@abp/utils@^3.1.0-rc.3": - version "3.1.0-rc.3" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0-rc.3.tgz#3cbc50c1f8fdf6592d66f8ea4b5a9c4249a5e46a" - integrity sha512-45KXx5zlxm5gK2EFwzM+hMjT8q8pD3PejyNfVP6HBbGE2N36LGKYtI59s6vFm5yV2qFxQyVPrk4mi3Y+neqlBw== - dependencies: - just-compare "^1.3.0" - -"@abp/utils@^3.1.0-rc.4": - version "3.1.0-rc.4" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0-rc.4.tgz#e0d25d60b1806d4bee23e1c9c0ffa7855cdffc2a" - integrity sha512-qzUqqkLJcrQV3OngDyQ0S8hEh3D1MxvvlFLOo77ajnaTO2X8hgnFm9mgQ2QnvH2QbKttaWpaaTX7TCYu/d7nBg== +"@abp/utils@^3.1.0", "@abp/utils@^3.1.0-rc.4": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0.tgz#ccbfed6591ab11466bf3fed740c8422acf6a84df" + integrity sha512-I5yjM1ovqcpBAT2LFOfwLibVE0Ql6XbP3tQj6YMEZ/foDXekn/4P6Spgq5DTZCMo+0jskS0D8NfL7Ce4p89buw== dependencies: just-compare "^1.3.0" @@ -126,23 +119,31 @@ jest-preset-angular "^8.2.1" lodash "^4.17.15" -"@angular-devkit/architect@0.1000.6", "@angular-devkit/architect@>=0.1000.0 < 0.1100.0": - version "0.1000.6" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1000.6.tgz#d8143abbf1a1cef8e0ea9c80690821e8ca4cd54c" - integrity sha512-IZ8yiiW+LQ5mI3VbNHzisTIn0j6D1inQZgcZtc5W2A7fFNvBlIh6vGU3mB6Qvg678Gt6tlvnNT6/R9A9Ct7VnA== +"@angular-devkit/architect@0.1000.8": + version "0.1000.8" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1000.8.tgz#dac11e07877145056ca6d22319f2a859bab6720d" + integrity sha512-2AqPbiEugtPxNz4MGhLh+imUVelhW9h1cdJs2AbxZosIxftPb5DNDQUSAwVmRGp4CtcXVrlvcDwc0f4Fw1aiIA== dependencies: - "@angular-devkit/core" "10.0.6" + "@angular-devkit/core" "10.0.8" rxjs "6.5.5" +"@angular-devkit/architect@>=0.1000.0 < 0.1100.0": + version "0.1001.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1001.0.tgz#39250758d749b88a3867f5ef529d52ad16b6c5fd" + integrity sha512-mJYy9tqy7ZfqAJYlQPgcHVUiaAxWnxEEpiTAftsKz/yqdO45YFkzehYXJfCqbAXYr4r7hYY3KqKMgj41ixkS8Q== + dependencies: + "@angular-devkit/core" "10.1.0" + rxjs "6.6.2" + "@angular-devkit/build-angular@~0.1000.6": - version "0.1000.6" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.1000.6.tgz#7c4a8a4792f7252fe8d0bd57b46e86f44c93d4b3" - integrity sha512-tKyVD8Wqfo2wFdfWmc7OMzFn30Zl37heEusnMrQD5/zZ3Hw4Nqt2kf3pf3hbWl1GExUVFYyRNoCOCh9DaIfh0w== - dependencies: - "@angular-devkit/architect" "0.1000.6" - "@angular-devkit/build-optimizer" "0.1000.6" - "@angular-devkit/build-webpack" "0.1000.6" - "@angular-devkit/core" "10.0.6" + version "0.1000.8" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.1000.8.tgz#28744499b59d85e6d16b27f3ee09e4d86c5770fe" + integrity sha512-wwDN2oadQvYPL7lDmvGsoWQjW++0ZnxWk1QVlABGhBSIs8Uxs26Hjd5YNUSsvJavBkqb1UZIOilqzb4dig5MIA== + dependencies: + "@angular-devkit/architect" "0.1000.8" + "@angular-devkit/build-optimizer" "0.1000.8" + "@angular-devkit/build-webpack" "0.1000.8" + "@angular-devkit/core" "10.0.8" "@babel/core" "7.9.6" "@babel/generator" "7.9.6" "@babel/plugin-transform-runtime" "7.9.6" @@ -150,7 +151,7 @@ "@babel/runtime" "7.9.6" "@babel/template" "7.8.6" "@jsdevtools/coverage-istanbul-loader" "3.0.3" - "@ngtools/webpack" "10.0.6" + "@ngtools/webpack" "10.0.8" ajv "6.12.3" autoprefixer "9.8.0" babel-loader "8.1.0" @@ -206,36 +207,36 @@ worker-plugin "4.0.3" "@angular-devkit/build-ng-packagr@~0.1000.6": - version "0.1000.6" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.1000.6.tgz#08fe3a0e140cd4be01949449c443a4e02fb68846" - integrity sha512-agE6Dw8EZmKw+vgdiJOpbrDX7JDX8jYFXVxkeCpkl3QIQSx3pDjBoggwV4NDo9mT8/R/i1WD5idFrrm+vbI/0w== + version "0.1000.8" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.1000.8.tgz#092805975248203043f0fbaf7a723be90bcdcbf0" + integrity sha512-sif0JkCjghhtHpxFfb2fJ6MnlyJXxhaWxswxnFSNQd9uLEr101AC7Ep0aDRnSJ2JUoSk1nlZnVtDqYUYAYexWw== dependencies: - "@angular-devkit/architect" "0.1000.6" + "@angular-devkit/architect" "0.1000.8" rxjs "6.5.5" -"@angular-devkit/build-optimizer@0.1000.6": - version "0.1000.6" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.1000.6.tgz#f5b208be155b0ffb37d7380fc1a0e12a3765319d" - integrity sha512-R8zDEAvd9PeUKvOKh6I7xp3w+MViCwjGKoOZcznjH/i/9PQjOHCMwU5S48RQloQjMGu96eDMUGOVnd9qkzXUEw== +"@angular-devkit/build-optimizer@0.1000.8": + version "0.1000.8" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.1000.8.tgz#55023cf9e16813cc01b255e99fabb92426eeb632" + integrity sha512-esODHuTGEEMx1SmLUq03VAMly8gZUd1vRuvZeKS5HqKwDg8ZzcI7/25BuuUSlyST+6BEdjo2gnmagQnG0VBdQw== dependencies: loader-utils "2.0.0" source-map "0.7.3" tslib "2.0.0" webpack-sources "1.4.3" -"@angular-devkit/build-webpack@0.1000.6": - version "0.1000.6" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1000.6.tgz#1ec6942b4079b6cb6704b5d39af7df14102d562e" - integrity sha512-R01bJWuvckU5IdjcqoCeikLBpHRqt5fgfD0a4Hsg3evqW6xxXcSgc+YhWfeEmyU/nF/kVel8G2bFyPzhZP4QdQ== +"@angular-devkit/build-webpack@0.1000.8": + version "0.1000.8" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1000.8.tgz#048bd8e2db19b42cb3913dd2959dcd2589e5ec10" + integrity sha512-y/U+dV5N8W7KECncGSKQWoUH/DFNZCseczyl6LAd8bc0fMr8Z0TAIe8OXj+5CSRRdejWfRIxGtNWM+L2kTCU8A== dependencies: - "@angular-devkit/architect" "0.1000.6" - "@angular-devkit/core" "10.0.6" + "@angular-devkit/architect" "0.1000.8" + "@angular-devkit/core" "10.0.8" rxjs "6.5.5" -"@angular-devkit/core@10.0.6", "@angular-devkit/core@^10.0.0": - version "10.0.6" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-10.0.6.tgz#cbb40a34f976f9496270efc4fbdb3ad836b9723e" - integrity sha512-mVvqSEoeErZ7bAModk95EAa6R9Nl23rvX+/TXuKVTK2dziMFBOrwHjb1DYhnZxFIH4xfUftCx+BWHjXBXCPYlA== +"@angular-devkit/core@10.0.8", "@angular-devkit/core@~10.0.3": + version "10.0.8" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-10.0.8.tgz#ca4ea9f464cfa7ff17e2dab3bcd4c59da1ea450d" + integrity sha512-d9S8VQuqaYg0c/Y2kl/MtICtZ+UKlH5bLm8y2fb2WfSL4A5XIqMGdEVxzFSiR0b1Bnt4NAoQMcBec1blHAqMSQ== dependencies: ajv "6.12.3" fast-json-stable-stringify "2.1.0" @@ -243,15 +244,15 @@ rxjs "6.5.5" source-map "0.7.3" -"@angular-devkit/core@10.0.8", "@angular-devkit/core@~10.0.3": - version "10.0.8" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-10.0.8.tgz#ca4ea9f464cfa7ff17e2dab3bcd4c59da1ea450d" - integrity sha512-d9S8VQuqaYg0c/Y2kl/MtICtZ+UKlH5bLm8y2fb2WfSL4A5XIqMGdEVxzFSiR0b1Bnt4NAoQMcBec1blHAqMSQ== +"@angular-devkit/core@10.1.0", "@angular-devkit/core@^10.0.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-10.1.0.tgz#3e4d6abc0b949f4e2fba94077d17c132eb0a673f" + integrity sha512-oNRwAX+5uEwgheS3UUc1W+AerbimqGojCOTdWWcq5XtSviZnBCp1FeMZV+eB6XgUWfbmbWBu39S3sCYmXVHLwg== dependencies: - ajv "6.12.3" + ajv "6.12.4" fast-json-stable-stringify "2.1.0" magic-string "0.25.7" - rxjs "6.5.5" + rxjs "6.6.2" source-map "0.7.3" "@angular-devkit/core@8.3.29", "@angular-devkit/core@^8.0.3": @@ -265,12 +266,12 @@ rxjs "6.4.0" source-map "0.7.3" -"@angular-devkit/schematics@10.0.6": - version "10.0.6" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-10.0.6.tgz#dc3486448cc34544f7076f7fe0a67b75137ae840" - integrity sha512-V3T4cf+jVKiPYyBrSVHf3ZSnk4wIc1WEaaeFta56HccEGQCQpvAFKqDurmtMHer50Hhaxhn7IC3Oi5kPnvkNyQ== +"@angular-devkit/schematics@10.0.8", "@angular-devkit/schematics@~10.0.3": + version "10.0.8" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-10.0.8.tgz#6064d6323a1c9abc195e67ae4c88e373ce36b5e2" + integrity sha512-p2PjvrExuzOe/azyOEcBeIgwZIk4D6VeLkJf/KVjhXOVu13pjIXHX7/qWl+IYnbtj3NZGHqXM5Cr8nxsJNIMpw== dependencies: - "@angular-devkit/core" "10.0.6" + "@angular-devkit/core" "10.0.8" ora "4.0.4" rxjs "6.5.5" @@ -282,19 +283,10 @@ "@angular-devkit/core" "8.3.29" rxjs "6.4.0" -"@angular-devkit/schematics@~10.0.3": - version "10.0.8" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-10.0.8.tgz#6064d6323a1c9abc195e67ae4c88e373ce36b5e2" - integrity sha512-p2PjvrExuzOe/azyOEcBeIgwZIk4D6VeLkJf/KVjhXOVu13pjIXHX7/qWl+IYnbtj3NZGHqXM5Cr8nxsJNIMpw== - dependencies: - "@angular-devkit/core" "10.0.8" - ora "4.0.4" - rxjs "6.5.5" - "@angular/animations@~10.0.10": - version "10.0.10" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-10.0.10.tgz#c4f872e2917e9e7d4ffd04a64539e2aae67eef0c" - integrity sha512-lIbNeLVVl9bO41orPFpKoobCvxZIZ2wdcKJBEFtQiOdw0khRQQ8k7so4TAWOZXRJR+MkOUCjU2pO8gbMXgBweQ== + version "10.0.14" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-10.0.14.tgz#8e7fa9b26c70cf8e67ec0cc943211eb3957dda8c" + integrity sha512-0BOGQOuaudIG0pq6FAnG55teKM7tEQZdIwdoOf0okhh9n0cFWSWRUjvUxWt25bWswlO+HxELyJioiRUvVSES4g== dependencies: tslib "^2.0.0" @@ -306,15 +298,15 @@ parse5 "^5.0.0" "@angular/cli@~10.0.6": - version "10.0.6" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-10.0.6.tgz#366114e36a155611b553be535bec166bd28b4119" - integrity sha512-gQbQA/CsCyMf9RKEv1hJBCdBebV2BHeT4lGi56Eii0IkvZD5WIH0dNfQzR+6ErqGDgE1EI+9YCuX3psMEvCRUA== - dependencies: - "@angular-devkit/architect" "0.1000.6" - "@angular-devkit/core" "10.0.6" - "@angular-devkit/schematics" "10.0.6" - "@schematics/angular" "10.0.6" - "@schematics/update" "0.1000.6" + version "10.0.8" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-10.0.8.tgz#133f1ea23e622923fd5dae27f5689379cfacaad3" + integrity sha512-unTteffLepsFw7qQulHOLLyLqCpQMOaZo0WO4x6cQGcW2mc0WgwnwBW2JDYMx1U2434t/Q13LqYMPNYWyCGsog== + dependencies: + "@angular-devkit/architect" "0.1000.8" + "@angular-devkit/core" "10.0.8" + "@angular-devkit/schematics" "10.0.8" + "@schematics/angular" "10.0.8" + "@schematics/update" "0.1000.8" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.1" debug "4.1.1" @@ -332,9 +324,9 @@ uuid "8.1.0" "@angular/common@~10.0.10": - version "10.0.10" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-10.0.10.tgz#405c3640449bbf9f2c3c764be93a91749cb931d4" - integrity sha512-p6/pTk0s0Ai5uUkOHHFZwp+TjxRNPldPxTU2LVxg2xuBEQTO53BsfBKn3zi74epdb1kBC0Yjdj6yEL4dITBs7A== + version "10.0.14" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-10.0.14.tgz#a08228323609a22559590f4295b26f247f7438f4" + integrity sha512-EOAuaMt2HwJF3DtIJ/ksHtnF8Pqh5K2rWISYLEs9R3WNaSGn74kbCODAT4pNhI8P22Ykl3H4FmQUgnDZ3uDAUg== dependencies: tslib "^2.0.0" @@ -365,51 +357,51 @@ tslib "^2.0.0" "@angular/core@~10.0.10": - version "10.0.10" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-10.0.10.tgz#10ca31d55899992e0b1585cfef4df8c40a1c60ac" - integrity sha512-PIQhLqjZayVXJoXs4WQu7orkePqFiux19y7bgBrsSAithe+g9BkrSIdX7+tkkX0zggUWKywY92YuMZCJ/S+uiw== + version "10.0.14" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-10.0.14.tgz#000f091e6c17239232120fdca871fdac6b529ebd" + integrity sha512-m+c9g6fA/gE+6K7It01b6r8TEmbuFjUZajQ9gG/pzist0mTBcqfvn0O4h5X+ebnSgw/bbnnp+4PbaXEi1pOWZQ== dependencies: tslib "^2.0.0" "@angular/forms@~10.0.10": - version "10.0.10" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-10.0.10.tgz#c9ed1728be678209beaae89f9aa257357764fb36" - integrity sha512-bWjbsqMTiCNQZzXAfiEwT/tiAzSvChnqBimrJWNSHVYRkp71TkDcKXn6mA+E//YR0eZ84GKNNiVlKFxqkmeyqQ== + version "10.0.14" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-10.0.14.tgz#b6e1a7f872c318039be21b0a11839c8df063f0a3" + integrity sha512-McKh3rXDlAE7qmCnyWKENb2HhqAT+1dsAfChuqs0w8jhKkoRgA00RDFee6dZ6XQCc907DwuV0K8+wC3CvBp35w== dependencies: tslib "^2.0.0" "@angular/language-service@~10.0.10": - version "10.0.10" - resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-10.0.10.tgz#ef01bcd48b8ce51b57c755e75c725b2b6ae43d2f" - integrity sha512-Id3hmPR5UeWAKsDeB6+O7m+4+FpUr5zcYdM8xXAzTjjn8laSuDUMb17wsAVRntPgRJv4SeaqUbWevwSkM5KExA== + version "10.0.14" + resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-10.0.14.tgz#b9c33d27dcd11e2bb0c5453df1e7b334a0896a94" + integrity sha512-QQLYUjD0T6u2hLNYXUEUbupAGsz5egmhCAckaQojvXCe3SLL/hQsrK4odrNuspy7TvMB0H5ZNEHGlF6m/WLZ3g== "@angular/localize@~10.0.10": - version "10.0.10" - resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-10.0.10.tgz#42f981685d4bbd949ac6e6066a142e45331d65da" - integrity sha512-5zIbAqcwzHPqOg/LK7G8WJ2cNEl8hpmObcsqiw3IVyD831htnwWglfkgcR+dJvPWiYRxTGnxe2fvEnIhFpZOXQ== + version "10.0.14" + resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-10.0.14.tgz#99064a3b12e94e54e791c0638fbbbcc8783d8a62" + integrity sha512-tV1oUii6bxpQ6bKELcZsibUEEGmNiROxy8xRW015VgrgMFhuNuesHSmNUIstZ7ag8/sjh0/w1p55PUB6LEiPFA== dependencies: "@babel/core" "7.8.3" glob "7.1.2" yargs "15.3.0" "@angular/platform-browser-dynamic@~10.0.10": - version "10.0.10" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.0.10.tgz#0ae069a67c3fa7d593af554a333dd2b69d12903c" - integrity sha512-6jbn0Ldyc+80BCETGtE7pzfKlbjfa/wEPhLEGWoYtxrrJ5UB3CblGpDMOsv1ibOQijPZ/JSmIMmAxz66+pLx3g== + version "10.0.14" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.0.14.tgz#4ee2257b2ccb94949f0a8083884020a814b5d47c" + integrity sha512-PPCAiNh/JSuQNKXOhj3a8CTFdVhTgF/EpGtaotnVr/BfbJMeFImKo7m2QQOTsAFaEP2DurSHnofPnMWAfHS2mg== dependencies: tslib "^2.0.0" "@angular/platform-browser@~10.0.10": - version "10.0.10" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-10.0.10.tgz#13ea3e32fb798c6d10148d38f1c9589a26f74e6d" - integrity sha512-srNGkvg9177skff7QOe3L+nGOSbrKLzFt3Z5O3oM0N0TWr8QlWEA+zQm8n0zLHI8AmdZbmFzAYYJiBvVCSc5RQ== + version "10.0.14" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-10.0.14.tgz#43b9aa7fcd8f312b58f371206df265c31ea13fac" + integrity sha512-DcBZ1wt2TwtXrdcmCTWanAzu2Vxk5Uvioam0UcDxcgXD84T2fHipyfZVn07fMqRvzFQj45tDNAEevFBnGZar4w== dependencies: tslib "^2.0.0" "@angular/router@~10.0.10": - version "10.0.10" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-10.0.10.tgz#fee0fccbe00c3f4a29ddeef9fe1bcbcb8b7ad28c" - integrity sha512-wDmr/Spuv4OhPK5a49AvgJhaedRw4yb7nmPMd51sWqzOV31RRcGXORjiXZOcSpElLxM9f7JV0tWDR5p5ko/kPA== + version "10.0.14" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-10.0.14.tgz#e8942e93a8154e1be749e1f9d79afa5f7b5b9cb9" + integrity sha512-VWzaNyPZDY99TMszV1GlXJgVOxXsjhJrsv3mIcjaz1dfdlKOeKTVDLdnyXfP9CkwE3PRmvG7eSXppIj6nn9BpQ== dependencies: tslib "^2.0.0" @@ -487,18 +479,18 @@ source-map "^0.5.0" "@babel/core@^7.1.0", "@babel/core@^7.7.5": - version "7.11.1" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.1.tgz#2c55b604e73a40dc21b0e52650b11c65cf276643" - integrity sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ== + version "7.11.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.6.tgz#3a9455dc7387ff1bac45770650bc13ba04a15651" + integrity sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.0" + "@babel/generator" "^7.11.6" "@babel/helper-module-transforms" "^7.11.0" "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.11.1" + "@babel/parser" "^7.11.5" "@babel/template" "^7.10.4" - "@babel/traverse" "^7.11.0" - "@babel/types" "^7.11.0" + "@babel/traverse" "^7.11.5" + "@babel/types" "^7.11.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" @@ -518,12 +510,12 @@ lodash "^4.17.13" source-map "^0.5.0" -"@babel/generator@^7.11.0", "@babel/generator@^7.8.3", "@babel/generator@^7.9.6": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.0.tgz#4b90c78d8c12825024568cbe83ee6c9af193585c" - integrity sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ== +"@babel/generator@^7.11.5", "@babel/generator@^7.11.6", "@babel/generator@^7.8.3", "@babel/generator@^7.9.6": + version "7.11.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.6.tgz#b868900f81b163b4d464ea24545c61cbac4dc620" + integrity sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA== dependencies: - "@babel/types" "^7.11.0" + "@babel/types" "^7.11.5" jsesc "^2.5.1" source-map "^0.5.0" @@ -572,11 +564,10 @@ lodash "^4.17.19" "@babel/helper-explode-assignable-expression@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz#40a1cd917bff1288f699a94a75b37a1a2dbd8c7c" - integrity sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A== + version "7.11.4" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz#2d8e3470252cc17aba917ede7803d4a7a276a41b" + integrity sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ== dependencies: - "@babel/traverse" "^7.10.4" "@babel/types" "^7.10.4" "@babel/helper-function-name@^7.10.4": @@ -649,14 +640,13 @@ lodash "^4.17.19" "@babel/helper-remap-async-to-generator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz#fce8bea4e9690bbe923056ded21e54b4e8b68ed5" - integrity sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg== + version "7.11.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz#4474ea9f7438f18575e30b0cac784045b402a12d" + integrity sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA== dependencies: "@babel/helper-annotate-as-pure" "^7.10.4" "@babel/helper-wrap-function" "^7.10.4" "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" "@babel/types" "^7.10.4" "@babel/helper-replace-supers@^7.10.4": @@ -724,10 +714,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.0", "@babel/parser@^7.11.1", "@babel/parser@^7.8.3", "@babel/parser@^7.8.6", "@babel/parser@^7.9.6": - version "7.11.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.3.tgz#9e1eae46738bcd08e23e867bab43e7b95299a8f9" - integrity sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA== +"@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.5", "@babel/parser@^7.8.3", "@babel/parser@^7.8.6", "@babel/parser@^7.9.6": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037" + integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q== "@babel/plugin-proposal-async-generator-functions@^7.8.3": version "7.10.5" @@ -1216,9 +1206,9 @@ semver "^5.5.0" "@babel/preset-modules@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" - integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== + version "0.1.4" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" + integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" @@ -1258,25 +1248,25 @@ "@babel/parser" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.9.6": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz#9b996ce1b98f53f7c3e4175115605d56ed07dd24" - integrity sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5", "@babel/traverse@^7.8.3", "@babel/traverse@^7.9.6": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3" + integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.0" + "@babel/generator" "^7.11.5" "@babel/helper-function-name" "^7.10.4" "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.11.0" - "@babel/types" "^7.11.0" + "@babel/parser" "^7.11.5" + "@babel/types" "^7.11.5" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.19" -"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@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.11.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" - integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA== +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.11.5", "@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.11.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d" + integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q== dependencies: "@babel/helper-validator-identifier" "^7.10.4" lodash "^4.17.19" @@ -2323,20 +2313,20 @@ tslib "^2.0.0" "@ngneat/spectator@^5.13.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@ngneat/spectator/-/spectator-5.13.0.tgz#0a9720c3d3b60571c3619054f9831856997acf67" - integrity sha512-BlCmmgHMPtrdJECwctFmziRhHzSF3xxRnKiR/qJIerCd4csgpwGbhtEEh/2jnFEyLP6yLo4T4nCslwq3dHdFrQ== + version "5.13.3" + resolved "https://registry.yarnpkg.com/@ngneat/spectator/-/spectator-5.13.3.tgz#e02104fcd6938c921d6a792601ec609e665eafda" + integrity sha512-y85WJeowMW6nqoWCY1ZkiXUEGuBO7dpGUAcL2CQL+GZ2ldr8iEtH00jLIoqWaW4C9pqopficsM8oFYPJIS4b2w== dependencies: "@testing-library/dom" "6.1.0" jquery "3.5.0" replace-in-file "^4.1.3" -"@ngtools/webpack@10.0.6": - version "10.0.6" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-10.0.6.tgz#6fe392ecad9f2869fc68eda7f1344ad0b68a8898" - integrity sha512-AbSDhPmsljkZO2jHFpge/5AHLQIrbscWgo4brrhF7NQ5TvPgE0Xn0wU7gxB9++hVUKQLGnnbAvewJyB/uYb9Nw== +"@ngtools/webpack@10.0.8": + version "10.0.8" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-10.0.8.tgz#c818415a150ff6d578b25311b97859220b9d5a10" + integrity sha512-Qv4v7O4VGeWuXjRThd/mdC2I4cJOgQ7kDrVN7vkDB2EW5xtRB+/4hghvFeO3bD11FLuFvCxBMb0HbwyKoVQgEQ== dependencies: - "@angular-devkit/core" "10.0.6" + "@angular-devkit/core" "10.0.8" enhanced-resolve "4.1.1" rxjs "6.5.5" webpack-sources "1.4.3" @@ -2519,9 +2509,9 @@ "@types/node" ">= 8" "@octokit/types@^5.0.0", "@octokit/types@^5.0.1": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-5.4.0.tgz#25f2f8e24fec09214553168c41c06383c9d0f529" - integrity sha512-D/uotqF69M50OIlwMqgyIg9PuLT2daOiBAYF0P40I2ekFA2ESwwBY5dxZe/UhXdPvIbNKDzuZmQrO7rMpuFbcg== + version "5.4.1" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-5.4.1.tgz#d5d5f2b70ffc0e3f89467c3db749fa87fc3b7031" + integrity sha512-OlMlSySBJoJ6uozkr/i03nO5dlYQyE05vmQNZhAh9MyO4DPBP88QlwsDVLmVjIMFssvIZB6WO0ctIGMRG+xsJQ== dependencies: "@types/node" ">= 8" @@ -2566,21 +2556,21 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@schematics/angular@10.0.6", "@schematics/angular@~10.0.5": - version "10.0.6" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-10.0.6.tgz#568590574dca1556280a0a04f625f79bee34ee4a" - integrity sha512-TPBpo0GnMJLvKE6rYZDkSy9pnkMH55rSJ6nfLDpQ5zzmhoD/QnASUr8trfTFs3+MqmPlX61xI00+HmStmI8sJQ== +"@schematics/angular@10.0.8", "@schematics/angular@~10.0.5": + version "10.0.8" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-10.0.8.tgz#af730827b2de6cab7561157a8772250eb5f277e1" + integrity sha512-KNO61UGtiKMQSG+NbusqLtwLbxId0y+xpXJt9PKFwi+vaViOO+YzOPREfiFCuQ7q6X8SmNlrMj6sZ34E2YN1pQ== dependencies: - "@angular-devkit/core" "10.0.6" - "@angular-devkit/schematics" "10.0.6" + "@angular-devkit/core" "10.0.8" + "@angular-devkit/schematics" "10.0.8" -"@schematics/update@0.1000.6": - version "0.1000.6" - resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.1000.6.tgz#f0131d4b3ed879ae8f19c032d310bece79691738" - integrity sha512-GGfPGPjRF/MA4EeJ+h1ebzoYDzChF4BV7SaTfpT107LPCD3McRjKS39Jw2qH/ArGNSbrbJ8fYNOIj3g/uh1GoA== +"@schematics/update@0.1000.8": + version "0.1000.8" + resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.1000.8.tgz#3b745ec14e92cfd1f7d16f9a4c3864e1f12249c9" + integrity sha512-xHuj6ME3PNTsVUrpftd98LF3WHPM0NU25GcT/n0E/j0/52yDTiaPS3wUnYSK8ZSv4Et4hcyGx7f/LEXAoOKJXw== dependencies: - "@angular-devkit/core" "10.0.6" - "@angular-devkit/schematics" "10.0.6" + "@angular-devkit/core" "10.0.8" + "@angular-devkit/schematics" "10.0.8" "@yarnpkg/lockfile" "1.1.0" ini "1.3.5" npm-package-arg "^8.0.0" @@ -2594,15 +2584,10 @@ resolved "https://registry.yarnpkg.com/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz#5405ee8e444ed212db44e79351f0c70a582aae25" integrity sha512-DetpxZw1fzPD5xUBrIAoplLChO2VB8DlL5Gg+I1IR9b2wPqYIca2WSUxL5g1vLeR4MsQq1NeWriXAVffV+U1Fw== -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - -"@sindresorhus/is@^3.0.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-3.1.0.tgz#d8735532635bea69ad39119df5f0f10099bd09dc" - integrity sha512-n4J+zu52VdY43kdi/XdI9DzuMr1Mur8zFL5ZRG2opCans9aiFwkPxHYFEb5Xgy7n1Z4K6WfI4FpqUqsh3E8BPQ== +"@sindresorhus/is@^3.1.1": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-3.1.2.tgz#548650de521b344e3781fbdb0ece4aa6f729afb8" + integrity sha512-JiX9vxoKMmu8Y3Zr2RVathBL1Cdu4Nt4MuNWemt1Nc06A0RAin9c5FArkhGsyMBWfCu4zj+9b+GxtjAnE4qqLQ== "@sinonjs/commons@^1.7.0": version "1.8.1" @@ -2616,13 +2601,6 @@ resolved "https://registry.yarnpkg.com/@swimlane/ngx-datatable/-/ngx-datatable-17.1.0.tgz#ef2f91c3783526e7e89ac7a62a53e7bc9e1c90d5" integrity sha512-zYUS7uNO9OJ5UQZFuuTRjlPu6vdKA+FHYLfeEs7PgSuUiDCcbl2SWoUdS/3zIoWn/qQyws767ueWiAvvWUbpEw== -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - "@szmarczak/http-timer@^4.0.5": version "4.0.5" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.5.tgz#bfbd50211e9dfa51ba07da58a14cdfd333205152" @@ -2748,14 +2726,14 @@ "@types/istanbul-lib-report" "*" "@types/jasmine@^3.3.9": - version "3.5.12" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.5.12.tgz#5c378c1545cdc7cb339cff5578f854b6d1e0a17d" - integrity sha512-vJaQ58oceFao+NzpKNqLOWwHPsqA7YEhKv+mOXvYU4/qh+BfVWIxaBtL0Ck5iCS67yOkNwGkDCrzepnzIWF+7g== + version "3.5.14" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.5.14.tgz#f41a14e8ffa939062a71cf9722e5ee7d4e1f94af" + integrity sha512-Fkgk536sHPqcOtd+Ow+WiUNuk0TSo/BntKkF8wSvcd6M2FvPjeXcUE6Oz/bwDZiUZEaXLslAgw00Q94Pnx6T4w== "@types/jest@26.x": - version "26.0.10" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.10.tgz#8faf7e9756c033c39014ae76a7329efea00ea607" - integrity sha512-i2m0oyh8w/Lum7wWK/YOZJakYF8Mx08UaKA1CtbmFeDquVhAEdA7znacsVSf2hJ1OQ/OfVMGN90pw/AtzF8s/Q== + version "26.0.13" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.13.tgz#5a7b9d5312f5dd521a38329c38ee9d3802a0b85e" + integrity sha512-sCzjKow4z9LILc6DhBvn5AkIfmQzDZkgtVVKmGwVrs5tuid38ws281D4l+7x1kP487+FlKDh5kfMZ8WSPAdmdA== dependencies: jest-diff "^25.2.1" pretty-format "^25.2.1" @@ -2768,10 +2746,10 @@ jest-diff "^25.2.1" pretty-format "^25.2.1" -"@types/json-schema@^7.0.4": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" - integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== +"@types/json-schema@^7.0.5": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" + integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== "@types/keyv@*": version "3.1.1" @@ -2791,19 +2769,19 @@ integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= "@types/node@*", "@types/node@>= 8": - version "14.6.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.0.tgz#7d4411bf5157339337d7cff864d9ff45f177b499" - integrity sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA== + version "14.6.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.4.tgz#a145cc0bb14ef9c4777361b7bbafa5cf8e3acb5a" + integrity sha512-Wk7nG1JSaMfMpoMJDKUsWYugliB2Vy55pdjLpmLixeyMi7HizW2I/9QoxsPCkXl3dO+ZOVqPumKaDUv5zJu2uQ== "@types/node@^12.11.1": - version "12.12.54" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.54.tgz#a4b58d8df3a4677b6c08bfbc94b7ad7a7a5f82d1" - integrity sha512-ge4xZ3vSBornVYlDnk7yZ0gK6ChHf/CHB7Gl1I0Jhah8DDnEQqBzgohYG4FX4p81TNirSETOiSyn+y1r9/IR6w== + version "12.12.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.55.tgz#0aa266441cb9e1fd3e415a8f619cb7d776667cdd" + integrity sha512-Vd6xQUVvPCTm7Nx1N7XHcpX6t047ltm7TgcsOr4gFHjeYgwZevo+V7I1lfzHnj5BT5frztZ42+RTG4MwYw63dw== "@types/node@^8.0.31": - version "8.10.62" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.62.tgz#8d0d0db44a46ae7679d92e2e36d41bf1c3625d6a" - integrity sha512-76fupxOYVxk36kb7O/6KtrAPZ9jnSK3+qisAX4tQMEuGNdlvl7ycwatlHqjoE6jHfVtXFM3pCrCixZOidc5cuw== + version "8.10.63" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.63.tgz#f86775d576bc07a2992da244f41c23d3ba66d402" + integrity sha512-g+nSkeHFDd2WOQChfmy9SAXLywT47WZBrGS/NC5ym5PJ8c8RC6l4pbGaUW/X0+eZJnXw6/AVNEouXWhV4iz72Q== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -3155,9 +3133,9 @@ agentkeepalive@^3.4.1: humanize-ms "^1.2.1" 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== + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" indent-string "^4.0.0" @@ -3167,7 +3145,7 @@ ajv-errors@^1.0.0: resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== @@ -3182,7 +3160,7 @@ ajv@6.12.3: 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.12.3: +ajv@6.12.4, ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4: version "6.12.4" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234" integrity sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ== @@ -3204,13 +3182,6 @@ angular-oauth2-oidc@^10.0.0, angular-oauth2-oidc@^10.0.3: dependencies: tslib "^2.0.0" -ansi-align@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" - integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== - dependencies: - string-width "^3.0.0" - ansi-colors@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" @@ -3755,20 +3726,6 @@ bootstrap@^4.5.0: resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.5.2.tgz#a85c4eda59155f0d71186b6e6ad9b875813779ab" integrity sha512-vlGn0bcySYl/iV+BGA544JkkZP5LB3jsmkeKLFQakCOwCM3AOk7VkldBz4jrzSe+Z0Ezn99NVXa1o45cQY4R6A== -boxen@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" - integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^5.3.1" - chalk "^3.0.0" - cli-boxes "^2.2.0" - string-width "^4.1.0" - term-size "^2.1.0" - type-fest "^0.8.1" - widest-line "^3.1.0" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -3879,12 +3836,12 @@ browserify-zlib@^0.2.0: pako "~1.0.5" 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.14.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.0.tgz#2908951abfe4ec98737b72f34c3bcedc8d43b000" - integrity sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ== + version "4.14.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.1.tgz#cb2b490ba881d45dc3039078c7ed04411eaf3fa3" + integrity sha512-zyBTIHydW37pnb63c7fHFXUG6EcqWOqoMdDx6cdyaDFriZ20EoVxcE95S54N+heRqY8m8IUgB5zYta/gCwSaaA== dependencies: - caniuse-lite "^1.0.30001111" - electron-to-chromium "^1.3.523" + caniuse-lite "^1.0.30001124" + electron-to-chromium "^1.3.562" escalade "^3.0.2" node-releases "^1.1.60" @@ -4065,19 +4022,6 @@ cacheable-lookup@^5.0.3: resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.3.tgz#049fdc59dffdd4fc285e8f4f82936591bd59fec3" integrity sha512-W+JBqF9SWe18A72XFzN/V/CULFzPm7sBXzzR6ekkE+3tLG72wFZrBiBZhrZuDoYexop4PHJVdFAKb/Nj9+tm9w== -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - cacheable-request@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.1.tgz#062031c2856232782ed694a257fa35da93942a58" @@ -4181,10 +4125,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.30001032, caniuse-lite@^1.0.30001061, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001111: - version "1.0.30001115" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001115.tgz#c04cd828883ba47f6f776312e0817bcc9040cfa4" - integrity sha512-NZrG0439ePYna44lJX8evHX2L7Z3/z3qjVLnHgbBb/duNEnGo348u+BQS5o4HTWcrb++100dHFrU36IesIrC1Q== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001032, caniuse-lite@^1.0.30001061, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001124: + version "1.0.30001124" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001124.tgz#5d9998190258e11630d674fc50ea8e579ae0ced2" + integrity sha512-zQW8V3CdND7GHRH6rxm6s59Ww4g/qGWTheoboW9nfeMg7sUoopIfKCcNZUjwYRCOrvereh3kwDpZj4VLQ7zGtA== canonical-path@1.0.0: version "1.0.0" @@ -4351,11 +4295,6 @@ clean-stack@^2.0.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" - integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w== - cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" @@ -4546,15 +4485,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@^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== +commander@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.1.0.tgz#f8d722b78103141006b66f4c7ba1e97315ba75bc" + integrity sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA== commitizen@^4.0.3: - version "4.1.2" - resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-4.1.2.tgz#6095eb825fd3f0d3611df88e6803c69b23307e9a" - integrity sha512-LBxTQKHbVgroMz9ohpm86N+GfJobonGyvDc3zBGdZazbwCLz2tqLa48Rf2TnAdKx7/06W1i1R3SXUt5QW97qVQ== + version "4.2.1" + resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-4.2.1.tgz#3b098b16c6b1a37f0d129018dff6751b20cd3103" + integrity sha512-nZsp8IThkDu7C+93BFD/mLShb9Gd6Wsaf90tpKE3x/6u5y/Q52kzanIJpGr0qvIsJ5bCMpgKtr3Lbu3miEJfaA== dependencies: cachedir "2.2.0" cz-conventional-changelog "3.2.0" @@ -4564,9 +4503,9 @@ commitizen@^4.0.3: find-root "1.1.0" fs-extra "8.1.0" glob "7.1.4" - inquirer "6.5.0" + inquirer "6.5.2" is-utf8 "^0.2.1" - lodash "4.17.15" + lodash "^4.17.20" minimist "1.2.5" strip-bom "4.0.0" strip-json-comments "3.0.1" @@ -4649,18 +4588,6 @@ config-chain@^1.1.11: ini "^1.3.4" proto-list "~1.2.1" -configstore@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" - integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== - dependencies: - dot-prop "^5.2.0" - graceful-fs "^4.1.2" - make-dir "^3.0.0" - unique-string "^2.0.0" - write-file-atomic "^3.0.0" - xdg-basedir "^4.0.0" - connect-history-api-fallback@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" @@ -5057,11 +4984,6 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" -crypto-random-string@^2.0.0: - version "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" @@ -5356,9 +5278,9 @@ data-urls@^2.0.0: whatwg-url "^8.0.0" date-fns@^2.10.0: - version "2.15.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.15.0.tgz#424de6b3778e4e69d3ff27046ec136af58ae5d5f" - integrity sha512-ZCPzAMJZn3rNUvvQIMlXhDr4A+Ar07eLeGsGREoWU19a3Pqf5oYa+ccd+B3F6XVtQY6HANMFdOQ8A+ipFnvJdQ== + version "2.16.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.16.1.tgz#05775792c3f3331da812af253e1a935851d3834b" + integrity sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ== dateformat@^3.0.0: version "3.0.3" @@ -5416,13 +5338,6 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" - decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" @@ -5447,11 +5362,6 @@ deep-equal@^1.0.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -5477,11 +5387,6 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - defer-to-connect@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.0.tgz#83d6b199db041593ac84d781b5222308ccf4c2c1" @@ -5728,11 +5633,6 @@ dot-prop@^5.1.0, dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - duplexer@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" @@ -5761,10 +5661,10 @@ 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.523: - version "1.3.534" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.534.tgz#fc7af8518dd00a5b22a24aed3f116b5d097e2330" - integrity sha512-7x2S3yUrspNHQOoPk+Eo+iHViSiJiEGPI6BpmLy1eT2KRNGCkBt/NUYqjfXLd1DpDCQp7n3+LfA1RkbG+LqTZQ== +electron-to-chromium@^1.3.562: + version "1.3.562" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.562.tgz#79c20277ee1c8d0173a22af00e38433b752bc70f" + integrity sha512-WhRe6liQ2q/w1MZc8mD8INkenHivuHdrr4r5EQHNomy3NJux+incP6M6lDMd0paShP3MD0WGe5R1TWmEClf+Bg== elliptic@^6.5.3: version "6.5.3" @@ -5847,9 +5747,9 @@ env-paths@^2.2.0: integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== envinfo@^7.3.1: - version "7.7.2" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.2.tgz#098f97a0e902f8141f9150553c92dbb282c4cabe" - integrity sha512-k3Eh5bKuQnZjm49/L7H4cHzs2FlL5QjbTB3JrPxoTI8aJG7hVMe4uKyJxSYH4ahseby2waUwk5OaKX/nAsaYgg== + version "7.7.3" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.3.tgz#4b2d8622e3e7366afb8091b23ed95569ea0208cc" + integrity sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA== err-code@^1.0.0: version "1.1.2" @@ -5939,11 +5839,6 @@ escalade@^3.0.2: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4" integrity sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ== -escape-goat@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" - integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== - escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -5985,17 +5880,22 @@ esprima@^4.0.0, esprima@^4.0.1: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - estraverse "^4.1.0" + estraverse "^5.2.0" -estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + estree-walker@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" @@ -6022,9 +5922,9 @@ eventemitter3@^3.1.0: integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== eventemitter3@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" - integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== events@^3.0.0: version "3.2.0" @@ -6710,9 +6610,9 @@ git-up@^4.0.0: parse-url "^5.0.0" git-url-parse@^11.1.2: - version "11.1.3" - resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.1.3.tgz#03625b6fc09905e9ad1da7bb2b84be1bf9123143" - integrity sha512-GPsfwticcu52WQ+eHp0IYkAyaOASgYdtsQDIt4rUp6GbiNt1P9ddrh3O0kQB0eD4UJZszVqNT3+9Zwcg40fywA== + version "11.2.0" + resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.2.0.tgz#2955fd51befd6d96ea1389bbe2ef57e8e6042b04" + integrity sha512-KPoHZg8v+plarZvto4ruIzzJLFQoRx+sUs5DQSr07By9IBKguVd+e6jwrFR6/TP6xrCJlNV1tPqLO1aREc7O2g== dependencies: git-up "^4.0.0" @@ -6786,13 +6686,6 @@ global-dirs@^0.1.1: dependencies: ini "^1.3.4" -global-dirs@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201" - integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A== - dependencies: - ini "^1.3.5" - global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -6868,39 +6761,22 @@ globby@^9.2.0: slash "^2.0.0" got@^11.5.2: - version "11.5.2" - resolved "https://registry.yarnpkg.com/got/-/got-11.5.2.tgz#772e3f3a06d9c7589c7c94dc3c83cdb31ddbf742" - integrity sha512-yUhpEDLeuGiGJjRSzEq3kvt4zJtAcjKmhIiwNp/eUs75tRlXfWcHo5tcBaMQtnjHWC7nQYT5HkY/l0QOQTkVww== + version "11.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-11.6.0.tgz#4978c78f3cbc3a45ee95381f8bb6efd1db1f4638" + integrity sha512-ErhWb4IUjQzJ3vGs3+RR12NWlBDDkRciFpAkQ1LPUxi6OnwhGj07gQxjPsyIk69s7qMihwKrKquV6VQq7JNYLA== dependencies: - "@sindresorhus/is" "^3.0.0" + "@sindresorhus/is" "^3.1.1" "@szmarczak/http-timer" "^4.0.5" "@types/cacheable-request" "^6.0.1" "@types/responselike" "^1.0.0" cacheable-lookup "^5.0.3" cacheable-request "^7.0.1" decompress-response "^6.0.0" - http2-wrapper "^1.0.0-beta.5.0" + http2-wrapper "^1.0.0-beta.5.2" lowercase-keys "^2.0.0" p-cancelable "^2.0.0" responselike "^2.0.0" -got@^9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.4: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" @@ -7004,11 +6880,6 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has-yarn@^2.1.0: - version "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.0, has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -7196,7 +7067,7 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -http2-wrapper@^1.0.0-beta.5.0: +http2-wrapper@^1.0.0-beta.5.2: version "1.0.0-beta.5.2" resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz#8b923deb90144aea65cf834b016a340fc98556f3" integrity sha512-xYz9goEyBnC8XwXDTuC/MZ6t+MrKVQZOk4s7+PaDkwIsQd8IwqvM+0M6bA/2lvG8GHXcPdf+MejTUeO2LCPCeQ== @@ -7324,11 +7195,6 @@ import-from@^2.1.0: dependencies: resolve-from "^3.0.0" -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= - import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" @@ -7400,7 +7266,7 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@1.3.5, ini@^1.3.2, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: +ini@1.3.5, ini@^1.3.2, ini@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== @@ -7438,10 +7304,10 @@ inquirer-file-tree-selection-prompt@^1.0.2: lodash "^4.17.11" rxjs "^6.5.2" -inquirer@6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42" - integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA== +inquirer@6.5.2, inquirer@^6.2.0, inquirer@^6.4.1: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== dependencies: ansi-escapes "^3.2.0" chalk "^2.4.2" @@ -7476,25 +7342,6 @@ inquirer@7.1.0: strip-ansi "^6.0.0" through "^2.3.6" -inquirer@^6.2.0, inquirer@^6.4.1: - version "6.5.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" - integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - internal-ip@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" @@ -7717,14 +7564,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-installed-globally@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" - integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== - dependencies: - global-dirs "^2.0.1" - is-path-inside "^3.0.1" - is-interactive@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" @@ -7735,11 +7574,6 @@ is-module@^1.0.0: resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= -is-npm@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" - integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== - is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -7800,11 +7634,6 @@ is-path-inside@^2.1.0: dependencies: path-is-inside "^1.0.2" -is-path-inside@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" - integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== - is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -7906,11 +7735,6 @@ is-wsl@^2.1.1: dependencies: is-docker "^2.0.0" -is-yarn-global@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" - integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== - isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -8218,12 +8042,12 @@ jest-pnp-resolver@^1.2.1: integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== jest-preset-angular@^8.2.0, jest-preset-angular@^8.2.1: - 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== + version "8.3.1" + resolved "https://registry.yarnpkg.com/jest-preset-angular/-/jest-preset-angular-8.3.1.tgz#b8e4867639982a0989f4ef5ef0bad1c084070ef4" + integrity sha512-WhQm+0tXzikkvIF35XErV87DqYbieZI0R0MIGgn7VE/DDhdbXFDmYQxFZ7w4qcA0cGLLvSMTBbIsUtHeE/rFxQ== dependencies: - pretty-format "^26.0.0" - ts-jest "^26.0.0" + pretty-format "26.x" + ts-jest "26.x" jest-regex-util@^25.2.6: version "25.2.6" @@ -8485,11 +8309,6 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= - json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -8500,6 +8319,11 @@ json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-bet 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.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + 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" @@ -8597,13 +8421,6 @@ karma-source-map-support@1.4.0: dependencies: source-map-support "^0.5.5" -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - keyv@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.1.tgz#9fe703cb4a94d6d11729d320af033307efd02ee6" @@ -8645,13 +8462,6 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -latest-version@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" - integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== - dependencies: - package-json "^6.3.0" - lerna@^3.19.0: version "3.22.1" resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.22.1.tgz#82027ac3da9c627fd8bf02ccfeff806a98e65b62" @@ -8888,12 +8698,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@4.17.15: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== - -lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.2.1: +lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.2.1: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== @@ -8913,9 +8718,9 @@ log-symbols@^3.0.0: chalk "^2.4.2" loglevel@^1.6.8: - version "1.6.8" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171" - integrity sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA== + version "1.7.0" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.0.tgz#728166855a740d59d38db01cf46f042caa041bb0" + integrity sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ== lolex@^5.0.0: version "5.1.2" @@ -8944,11 +8749,6 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - lowercase-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" @@ -9137,9 +8937,9 @@ meow@^4.0.0: trim-newlines "^2.0.0" meow@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-7.1.0.tgz#50ecbcdafa16f8b58fb7eb9675b933f6473b3a59" - integrity sha512-kq5F0KVteskZ3JdfyQFivJEj2RaA8NFsS4+r9DaMKLcUHpk5OcHS3Q0XkCXONB1mZRPsu/Y/qImKri0nwSEZog== + version "7.1.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-7.1.1.tgz#7c01595e3d337fcb0ec4e8eed1666ea95903d306" + integrity sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA== dependencies: "@types/minimist" "^1.2.0" camelcase-keys "^6.2.2" @@ -9252,7 +9052,7 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-response@^1.0.0, mimic-response@^1.0.1: +mimic-response@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== @@ -9544,9 +9344,9 @@ next-tick@~1.0.0: integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= ng-packagr@^10.0.0: - version "10.0.4" - resolved "https://registry.yarnpkg.com/ng-packagr/-/ng-packagr-10.0.4.tgz#8c4503d0a7b49d7622d493527717f0b5b2e0ad97" - integrity sha512-ddx8+sRCXV8FXlmBVft+G3tdHH9W11MV4au/k+ZWEijPviGiUh0mj7JKfY0CTvtpyGAorE4ZzveiSTk5oIhlBQ== + version "10.1.0" + resolved "https://registry.yarnpkg.com/ng-packagr/-/ng-packagr-10.1.0.tgz#a2fc0f86f5f8895f811597d33d943f93c7c77c17" + integrity sha512-KXyajkAyY/51iMJPVezDybb5Bn1rtl/JDGC4w9jjIdeL2Ip+KTMDGsqpc+5nQm/vnasZcJ/Xj2a+0VOwrbyVWg== dependencies: "@rollup/plugin-commonjs" "^15.0.0" "@rollup/plugin-json" "^4.0.0" @@ -9556,7 +9356,7 @@ ng-packagr@^10.0.0: browserslist "^4.7.0" chalk "^4.0.0" chokidar "^3.2.1" - commander "^5.0.0" + commander "^6.0.0" cssnano-preset-default "^4.0.7" fs-extra "^9.0.0" glob "^7.1.2" @@ -9573,7 +9373,6 @@ ng-packagr@^10.0.0: sass "^1.23.0" stylus "^0.54.7" terser "^5.0.0" - update-notifier "^4.0.0" ng-zorro-antd@^9.3.0: version "9.3.0" @@ -10119,11 +9918,6 @@ osenv@^0.1.4, osenv@^0.1.5: 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" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - p-cancelable@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e" @@ -10246,16 +10040,6 @@ p-waterfall@^1.0.0: dependencies: p-reduce "^1.0.0" -package-json@^6.3.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" - integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== - dependencies: - got "^9.6.0" - registry-auth-token "^4.0.0" - registry-url "^5.0.0" - semver "^6.2.0" - pacote@9.5.12: version "9.5.12" resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.5.12.tgz#1e11dd7a8d736bcc36b375a9804d41bb0377bf66" @@ -10352,13 +10136,13 @@ parse-json@^4.0.0: json-parse-better-errors "^1.0.1" parse-json@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.1.tgz#7cfe35c1ccd641bce3981467e6c2ece61b3b3878" - integrity sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ== + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" + integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== dependencies: "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" + json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" parse-passwd@^1.0.0: @@ -10583,9 +10367,9 @@ posix-character-classes@^0.1.0: integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= postcss-calc@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.3.tgz#d65cca92a3c52bf27ad37a5f732e0587b74f1623" - integrity sha512-IB/EAEmZhIMEIhG7Ov4x+l47UaXOS1n2f4FBUk/aKllQhtSCxWhTzn0nJgkqN7fo/jcWySvWTSB6Syk9L+31bA== + version "7.0.4" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.4.tgz#5e177ddb417341e6d4a193c5d9fd8ada79094f8b" + integrity sha512-0I79VRAd1UTkaHzY9w83P39YGO/M3bG7/tNLrHGEunBolfoGM0hSjrGvjoeaj0JE/zIw5GsI2KZ0UwDJqv5hjw== dependencies: postcss "^7.0.27" postcss-selector-parser "^6.0.2" @@ -10966,16 +10750,21 @@ prepend-http@^1.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= - prettier@^1.18.2: version "1.19.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== +pretty-format@26.x: + version "26.4.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.4.2.tgz#d081d032b398e801e2012af2df1214ef75a81237" + integrity sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA== + dependencies: + "@jest/types" "^26.3.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + pretty-format@^24.3.0, pretty-format@^24.8.0: version "24.9.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" @@ -10996,16 +10785,6 @@ 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.4.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.4.0.tgz#c08073f531429e9e5024049446f42ecc9f933a3b" - integrity sha512-mEEwwpCseqrUtuMbrJG4b824877pM5xald3AkilJ47Po2YLr97/siejYQHqj2oDQBeJNbu+Q0qUuekJ8F0NAPg== - dependencies: - "@jest/types" "^26.3.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" @@ -11152,13 +10931,6 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -pupa@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.0.1.tgz#dbdc9ff48ffbea4a26a069b6f9f7abb051008726" - integrity sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA== - dependencies: - escape-goat "^2.0.0" - q@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" @@ -11255,16 +11027,6 @@ raw-loader@4.0.1: loader-utils "^2.0.0" schema-utils "^2.6.5" -rc@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - react-is@^16.12.0, react-is@^16.8.4: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" @@ -11285,16 +11047,14 @@ read-cmd-shim@^1.0.1: graceful-fs "^4.1.2" "read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.13: - version "2.1.1" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.1.tgz#16aa66c59e7d4dad6288f179dd9295fd59bb98f1" - integrity sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A== + version "2.1.2" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.2.tgz#6992b2b66c7177259feb8eaac73c3acd28b9222a" + integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA== dependencies: glob "^7.1.1" - json-parse-better-errors "^1.0.1" + json-parse-even-better-errors "^2.3.0" normalize-package-data "^2.0.0" npm-normalize-package-bin "^1.0.0" - optionalDependencies: - graceful-fs "^4.1.2" read-package-tree@5.3.1, read-package-tree@^5.1.6: version "5.3.1" @@ -11524,20 +11284,6 @@ regexpu-core@^4.7.0: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.2.0" -registry-auth-token@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.0.tgz#1d37dffda72bbecd0f581e4715540213a65eb7da" - integrity sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w== - dependencies: - rc "^1.2.8" - -registry-url@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" - integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== - dependencies: - rc "^1.2.8" - regjsgen@^0.5.1: version "0.5.2" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" @@ -11725,13 +11471,6 @@ resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.17.0, resolve@^1.3.2 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" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= - dependencies: - lowercase-keys "^1.0.0" - responselike@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" @@ -11841,9 +11580,9 @@ rollup@2.10.9: fsevents "~2.1.2" rollup@^2.8.0: - version "2.26.3" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.26.3.tgz#502c755872a4590937cfa4e8f7eb99d3bc3c4025" - integrity sha512-Mlt39/kL2rA9egcbQbaZV1SNVplGqYYhDDMcGgHPPE0tvM3R4GrB+IEdYy2QtTrdzMQx57ZcqDFf/KWWm8F+uw== + version "2.26.10" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.26.10.tgz#0ffe0390d35f07af850382f22f1b8525c7f57f07" + integrity sha512-dUnjCWOA0h9qNX6qtcHidyatz8FAFZxVxt1dbcGtKdlJkpSxGK3G9+DLCYvtZr9v94D129ij9zUhG+xbRoqepw== optionalDependencies: fsevents "~2.1.2" @@ -11883,7 +11622,7 @@ rxjs@6.5.5, 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.6.2, rxjs@^6.4.0, rxjs@^6.5.0, rxjs@^6.5.2, rxjs@^6.5.3: version "6.6.2" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.2.tgz#8096a7ac03f2cc4fe5860ef6e572810d9e01c0d2" integrity sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg== @@ -11981,13 +11720,13 @@ schema-utils@^1.0.0: ajv-keywords "^3.1.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== + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" select-hose@^2.0.0: version "2.0.0" @@ -12011,13 +11750,6 @@ selfsigned@^1.10.7: dependencies: node-forge "0.9.0" -semver-diff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" - integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== - dependencies: - semver "^6.3.0" - semver-dsl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/semver-dsl/-/semver-dsl-1.0.1.tgz#d3678de5555e8a61f629eed025366ae5f27340a0" @@ -12609,7 +12341,7 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: +string-width@^4.1.0, string-width@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== @@ -12727,11 +12459,6 @@ strip-json-comments@3.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - strong-log-transformer@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" @@ -12815,9 +12542,9 @@ supports-color@^6.1.0: has-flag "^3.0.0" supports-color@^7.0.0, supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" @@ -12937,11 +12664,6 @@ tempfile@^3.0.0: temp-dir "^2.0.0" uuid "^3.3.2" -term-size@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" - integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw== - terminal-link@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" @@ -12999,9 +12721,9 @@ terser@^4.1.2, terser@^4.6.13: source-map-support "~0.5.12" terser@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.1.0.tgz#1f4ab81c8619654fdded51f3157b001e1747281d" - integrity sha512-pwC1Jbzahz1ZPU87NQ8B3g5pKbhyJSiHih4gLH6WZiPU8mmS1IlGbB0A2Nuvkj/LCNsgIKctg6GkYwWCeTvXZQ== + version "5.3.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.0.tgz#c481f4afecdcc182d5e2bdd2ff2dc61555161e81" + integrity sha512-XTT3D3AwxC54KywJijmY2mxZ8nJiEjBHVYzq8l9OaYuRFWeQNBwvipuzzYEP4e+/AVcd1hqG/CqgsdIRyT45Fg== dependencies: commander "^2.20.0" source-map "~0.6.1" @@ -13119,11 +12841,6 @@ to-object-path@^0.3.0: dependencies: kind-of "^3.0.2" -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" @@ -13210,10 +12927,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@^26.0.0: - version "26.2.0" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.2.0.tgz#7ec22faceb05ee1467fdb5265d1b33c27441f163" - integrity sha512-9+y2qwzXdAImgLSYLXAb/Rhq9+K4rbt0417b8ai987V60g2uoNWBBmMkYgutI7D8Zhu+IbCSHbBtrHxB9d7xyA== +ts-jest@26.x: + version "26.3.0" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.3.0.tgz#6b2845045347dce394f069bb59358253bc1338a9" + integrity sha512-Jq2uKfx6bPd9+JDpZNMBJMdMQUC3sJ08acISj8NXlVgR2d5OqslEHOR2KHMgwymu8h50+lKIm0m0xj/ioYdW2Q== dependencies: "@types/jest" "26.x" bs-logger "0.x" @@ -13365,9 +13082,9 @@ type@^1.0.1: 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== + version "2.1.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.1.0.tgz#9bdc22c648cf8cf86dd23d32336a41cfb6475e3f" + integrity sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA== typedarray-to-buffer@^3.1.5: version "3.1.5" @@ -13387,9 +13104,9 @@ typescript@^3.5.2, typescript@~3.9.2, typescript@~3.9.5: integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== uglify-js@^3.1.4: - version "3.10.1" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.10.1.tgz#dd14767eb7150de97f2573a5ff210db14fffe4ad" - integrity sha512-RjxApKkrPJB6kjJxQS3iZlf///REXWYxYJxO/MpmlQzVkDWVI3PSnCBWezMecmTU/TRkNxrl8bmsfFQCp+LO+Q== + version "3.10.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.10.3.tgz#f0d2f99736c14de46d2d24649ba328be3e71c3bf" + integrity sha512-Lh00i69Uf6G74mvYpHCI9KVVXLcHW/xu79YTvH7Mkc9zyKUeSPz0owW0dguj0Scavns3ZOh3wY63J0Zb97Za2g== uid-number@0.0.6: version "0.0.6" @@ -13458,13 +13175,6 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== - dependencies: - crypto-random-string "^2.0.0" - universal-analytics@0.4.20: version "0.4.20" resolved "https://registry.yarnpkg.com/universal-analytics/-/universal-analytics-0.4.20.tgz#d6b64e5312bf74f7c368e3024a922135dbf24b03" @@ -13519,29 +13229,10 @@ upath@^1.1.1, upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-notifier@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.1.tgz#895fc8562bbe666179500f9f2cebac4f26323746" - integrity sha512-9y+Kds0+LoLG6yN802wVXoIfxYEwh3FlZwzMwpCZp62S2i1/Jzeqb9Eeeju3NSHccGGasfGlK5/vEHbAifYRDg== - dependencies: - boxen "^4.2.0" - chalk "^3.0.0" - configstore "^5.0.1" - has-yarn "^2.1.0" - import-lazy "^2.1.0" - is-ci "^2.0.0" - is-installed-globally "^0.3.1" - is-npm "^4.0.0" - is-yarn-global "^0.3.0" - latest-version "^5.0.0" - pupa "^2.0.1" - semver-diff "^3.1.1" - xdg-basedir "^4.0.0" - uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + version "4.4.0" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" + integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== dependencies: punycode "^2.1.0" @@ -13550,13 +13241,6 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= - dependencies: - prepend-http "^2.0.0" - url-parse@^1.4.3: version "1.4.7" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" @@ -13767,10 +13451,10 @@ 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== +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== webpack-dev-middleware@3.7.2, webpack-dev-middleware@^3.7.2: version "3.7.2" @@ -13924,13 +13608,13 @@ whatwg-url@^7.0.0: 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== + version "8.2.1" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.2.1.tgz#ed73417230784b281fb2a32c3c501738b46167c3" + integrity sha512-ZmVCr6nfBeaMxEHALLEGy0LszYjpJqf6PVNQUQ1qd9Et+q7Jpygd4rGGDXgHjD8e99yLFseD69msHDM4YwPZ4A== dependencies: lodash.sortby "^4.7.0" tr46 "^2.0.2" - webidl-conversions "^5.0.0" + webidl-conversions "^6.1.0" when@~3.6.x: version "3.6.4" @@ -13963,13 +13647,6 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - windows-release@^3.1.0: version "3.3.3" resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.3.tgz#1c10027c7225743eec6b89df160d64c2e0293999" @@ -14087,11 +13764,6 @@ ws@^7.0.0: resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== -xdg-basedir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" - integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== - xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" From c93b7956b10e5a91c483fba4581621109e44c930 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 02:11:29 +0300 Subject: [PATCH 035/116] chore: update angular.yml temprorary --- .github/workflows/angular.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/angular.yml b/.github/workflows/angular.yml index 52aaa57b98..05cdfba174 100644 --- a/.github/workflows/angular.yml +++ b/.github/workflows/angular.yml @@ -18,5 +18,11 @@ jobs: - uses: actions/setup-node@v1 with: node-version: '12.x' - - run: yarn && yarn ci + + - name: Install packages + run: yarn install + working-directory: npm/ng-packs + + - name: Run lint + run: yarn ng lint working-directory: npm/ng-packs From ea2545452438f065b1f5f86a2771a32513414959 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 02:12:10 +0300 Subject: [PATCH 036/116] chore: trigger angular action --- npm/ng-packs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm/ng-packs/README.md b/npm/ng-packs/README.md index 220bc57f37..f0a6482b63 100644 --- a/npm/ng-packs/README.md +++ b/npm/ng-packs/README.md @@ -26,4 +26,4 @@ If you will only develop the `dev-app`, you don't need to run `symlink-manager`. For more information, see the [docs.abp.io](https://docs.abp.io) -If would you like contribute, see the [contribution guideline](./CONTRIBUTING.md). \ No newline at end of file +If would you like contribute, see the [contribution guideline](./CONTRIBUTING.md). \ No newline at end of file From 24240b59b9a06bd2ab057a2d24ac79e0fd03d668 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 02:19:23 +0300 Subject: [PATCH 037/116] chore: trigger build --- npm/ng-packs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm/ng-packs/README.md b/npm/ng-packs/README.md index f0a6482b63..220bc57f37 100644 --- a/npm/ng-packs/README.md +++ b/npm/ng-packs/README.md @@ -26,4 +26,4 @@ If you will only develop the `dev-app`, you don't need to run `symlink-manager`. For more information, see the [docs.abp.io](https://docs.abp.io) -If would you like contribute, see the [contribution guideline](./CONTRIBUTING.md). \ No newline at end of file +If would you like contribute, see the [contribution guideline](./CONTRIBUTING.md). \ No newline at end of file From a5261b68aaf690b1eaf44371cc40a759c7ad48f0 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 02:21:53 +0300 Subject: [PATCH 038/116] chore: organize angular action steps --- .github/workflows/angular.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/angular.yml b/.github/workflows/angular.yml index 05cdfba174..782d468c48 100644 --- a/.github/workflows/angular.yml +++ b/.github/workflows/angular.yml @@ -26,3 +26,15 @@ jobs: - name: Run lint run: yarn ng lint working-directory: npm/ng-packs + + - name: Run prepare workspace + run: yarn prepare:workspace + working-directory: npm/ng-packs + + - name: Run test + run: yarn ci:test + working-directory: npm/ng-packs + + - name: Run build + run: yarn ci:build + working-directory: npm/ng-packs From a6cae24e8ff98c4041dcc548aaa711ba0eb75b2b Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 02:22:07 +0300 Subject: [PATCH 039/116] chore: trigger angular action --- npm/ng-packs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm/ng-packs/README.md b/npm/ng-packs/README.md index 220bc57f37..4bbe08c5fc 100644 --- a/npm/ng-packs/README.md +++ b/npm/ng-packs/README.md @@ -26,4 +26,4 @@ If you will only develop the `dev-app`, you don't need to run `symlink-manager`. For more information, see the [docs.abp.io](https://docs.abp.io) -If would you like contribute, see the [contribution guideline](./CONTRIBUTING.md). \ No newline at end of file +If would you like contribute, see the [contribution guideline](./CONTRIBUTING.md). From da8738b3714b292f1fdf15578154b14d3e578f44 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 02:26:12 +0300 Subject: [PATCH 040/116] chore: change a step name in angular.yml --- .github/workflows/angular.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/angular.yml b/.github/workflows/angular.yml index 782d468c48..b750fb4545 100644 --- a/.github/workflows/angular.yml +++ b/.github/workflows/angular.yml @@ -35,6 +35,6 @@ jobs: run: yarn ci:test working-directory: npm/ng-packs - - name: Run build + - name: Run prod build run: yarn ci:build working-directory: npm/ng-packs From 89c4c59c66e0e20419f9a4e8c88d603492edd20e Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 02:37:37 +0300 Subject: [PATCH 041/116] chore: comment 3 steps in angular.yml for test --- .github/workflows/angular.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/angular.yml b/.github/workflows/angular.yml index b750fb4545..406a252d59 100644 --- a/.github/workflows/angular.yml +++ b/.github/workflows/angular.yml @@ -23,17 +23,17 @@ jobs: run: yarn install working-directory: npm/ng-packs - - name: Run lint - run: yarn ng lint - working-directory: npm/ng-packs + # - name: Run lint + # run: yarn ng lint + # working-directory: npm/ng-packs - - name: Run prepare workspace - run: yarn prepare:workspace - working-directory: npm/ng-packs + # - name: Run prepare workspace + # run: yarn prepare:workspace + # working-directory: npm/ng-packs - - name: Run test - run: yarn ci:test - working-directory: npm/ng-packs + # - name: Run test + # run: yarn ci:test + # working-directory: npm/ng-packs - name: Run prod build run: yarn ci:build From 7b24bf2cfc7314378e7afb1bca384fb01d25d198 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 02:40:56 +0300 Subject: [PATCH 042/116] chore: update ci:build 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 1c3aaf5fef..32ff245f95 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -19,7 +19,7 @@ "prepare:workspace": "yarn scripts:build --noInstall", "ci": "yarn ng lint && yarn prepare:workspace && yarn ci:test && yarn ci:build", "ci:test": "ng test --coverage=false --silent", - "ci:build": "cd scripts && yarn build:prod", + "ci:build": "cd scripts && yarn install && yarn build:prod", "lerna": "lerna", "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" From b1286f1c07fef57a826ef27b15ce8f71c0f4b684 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 02:44:03 +0300 Subject: [PATCH 043/116] ci: add new steps to angular.yml --- .github/workflows/angular.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/angular.yml b/.github/workflows/angular.yml index 406a252d59..4480ce57c2 100644 --- a/.github/workflows/angular.yml +++ b/.github/workflows/angular.yml @@ -36,5 +36,13 @@ jobs: # working-directory: npm/ng-packs - name: Run prod build - run: yarn ci:build + run: yarn build --prod working-directory: npm/ng-packs + + - name: Install packages of app template + run: yarn install + working-directory: npm/templates/app/angular + + - name: Run prod build in app template + run: yarn build --prod + working-directory: npm/templates/app/angular From 37ca032ab4411b4fa6d02451d7d69066556fc8da Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 02:48:42 +0300 Subject: [PATCH 044/116] chore: change some step names in angular.yml --- .github/workflows/angular.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/angular.yml b/.github/workflows/angular.yml index 4480ce57c2..c1a1d10223 100644 --- a/.github/workflows/angular.yml +++ b/.github/workflows/angular.yml @@ -35,14 +35,14 @@ jobs: # run: yarn ci:test # working-directory: npm/ng-packs - - name: Run prod build - run: yarn build --prod - working-directory: npm/ng-packs + # - name: Build dev-app + # run: yarn build --prod + # working-directory: npm/ng-packs - name: Install packages of app template run: yarn install - working-directory: npm/templates/app/angular + working-directory: templates/app/angular - - name: Run prod build in app template + - name: Build app template run: yarn build --prod - working-directory: npm/templates/app/angular + working-directory: templates/app/angular From 8be8429c98fab84fd26bd81838013d96de40edbc Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 02:55:01 +0300 Subject: [PATCH 045/116] chore: trigger angular action --- npm/ng-packs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm/ng-packs/README.md b/npm/ng-packs/README.md index 4bbe08c5fc..220bc57f37 100644 --- a/npm/ng-packs/README.md +++ b/npm/ng-packs/README.md @@ -26,4 +26,4 @@ If you will only develop the `dev-app`, you don't need to run `symlink-manager`. For more information, see the [docs.abp.io](https://docs.abp.io) -If would you like contribute, see the [contribution guideline](./CONTRIBUTING.md). +If would you like contribute, see the [contribution guideline](./CONTRIBUTING.md). \ No newline at end of file From 58feb678d25baa08a6d4a0ced846a9e892844d3c Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 02:57:10 +0300 Subject: [PATCH 046/116] ci: update cache path --- .github/workflows/angular.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/angular.yml b/.github/workflows/angular.yml index c1a1d10223..a011f40195 100644 --- a/.github/workflows/angular.yml +++ b/.github/workflows/angular.yml @@ -12,7 +12,7 @@ jobs: - uses: actions/cache@v2 with: - path: '**/node_modules' + path: '*/*/node_modules' key: ${{ runner.os }}-${{ hashFiles('**/yarn.lock') }} - uses: actions/setup-node@v1 From 295945bea1688c5745f5dc34456fd255b46d893a Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 03:08:08 +0300 Subject: [PATCH 047/116] chore: comment a step for test in angular.yml --- .github/workflows/angular.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/angular.yml b/.github/workflows/angular.yml index a011f40195..8df639431f 100644 --- a/.github/workflows/angular.yml +++ b/.github/workflows/angular.yml @@ -43,6 +43,6 @@ jobs: run: yarn install working-directory: templates/app/angular - - name: Build app template - run: yarn build --prod - working-directory: templates/app/angular + # - name: Build app template + # run: yarn build --prod + # working-directory: templates/app/angular From 066110600a137ad51bffd220e6ff1f1d0e516c9f Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 03:13:48 +0300 Subject: [PATCH 049/116] chore: remove yarn.lock from app template gitignore --- templates/app/angular/.gitignore | 4 +- templates/app/angular/yarn.lock | 9720 ++++++++++++++++++++++++++++++ 2 files changed, 9721 insertions(+), 3 deletions(-) create mode 100644 templates/app/angular/yarn.lock diff --git a/templates/app/angular/.gitignore b/templates/app/angular/.gitignore index a8e3c659a1..6b1b9c15e7 100644 --- a/templates/app/angular/.gitignore +++ b/templates/app/angular/.gitignore @@ -43,6 +43,4 @@ testem.log # System Files .DS_Store -Thumbs.db - -yarn.lock \ No newline at end of file +Thumbs.db \ No newline at end of file diff --git a/templates/app/angular/yarn.lock b/templates/app/angular/yarn.lock new file mode 100644 index 0000000000..fdc7fcb450 --- /dev/null +++ b/templates/app/angular/yarn.lock @@ -0,0 +1,9720 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@abp/ng.account@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@abp/ng.account/-/ng.account-3.1.0.tgz#cd5fb46dffd7455188c10769220ed58806f455fa" + integrity sha512-/v+yyagHIUhjpJ1exzubf54XQBsgO2o3r3bFJFlWqzJoeCLufzyyppqK2UQ+6sQ7CjWP5jFCqo87R9myNn2xHA== + dependencies: + "@abp/ng.theme.shared" "~3.1.0" + tslib "^2.0.0" + +"@abp/ng.core@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@abp/ng.core/-/ng.core-3.1.0.tgz#aba988fd915a633ea7af3a68278cc2557a37446f" + integrity sha512-SRRA7MYh12irJMRCj9emE5hyw+5aeiETlohP1CdgpdhhT3/RSPwrSeZNGJU0ilk6tKoO2rcZT6fgGjhqQfMyOw== + dependencies: + "@abp/utils" "^3.1.0-rc.4" + "@angular/localize" "~10.0.10" + "@ngxs/router-plugin" "^3.6.2" + "@ngxs/storage-plugin" "^3.6.2" + "@ngxs/store" "^3.6.2" + angular-oauth2-oidc "^10.0.0" + just-clone "^3.1.0" + just-compare "^1.3.0" + snq "^1.0.3" + ts-toolbelt "6.15.4" + tslib "^2.0.0" + +"@abp/ng.feature-management@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@abp/ng.feature-management/-/ng.feature-management-3.1.0.tgz#a93b0d63dc542e3880a1c79ac1e630b2db19b8bf" + integrity sha512-CayqVZ8XJQXsmz+IU+OchXK/vl01x6DHA/oTpvkW9HM2kYYJ8dmD940kjr5i3ZX6WF2Q4yTc+wLgZhGQt7eK9Q== + dependencies: + "@abp/ng.theme.shared" "~3.1.0" + tslib "^2.0.0" + +"@abp/ng.identity@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@abp/ng.identity/-/ng.identity-3.1.0.tgz#d3086dd887c7ea2786e4c8620b3448333065053a" + integrity sha512-G4CToeEou4Zwr4NkpauwMKJme61lofd77PycWvFPVJ8Df6EctmxJc+u6NVgG7+ZjuFI+oTQrLwCEl3uPuznnpA== + dependencies: + "@abp/ng.permission-management" "~3.1.0" + "@abp/ng.theme.shared" "~3.1.0" + tslib "^2.0.0" + +"@abp/ng.permission-management@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@abp/ng.permission-management/-/ng.permission-management-3.1.0.tgz#c0a9a135699b7c8a329c0c9ac839cde06dce3db2" + integrity sha512-u3JwxK1vAlqC6YBVqnyP26FZqArrIQn94fZ/Vm6n9rjId7VaJbA0UrX9d2YAwKROKOpAnBNc5GA0A2gaWIO9rg== + dependencies: + "@abp/ng.theme.shared" "~3.1.0" + tslib "^2.0.0" + +"@abp/ng.schematics@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@abp/ng.schematics/-/ng.schematics-3.1.0.tgz#ea7dd6d7dfd02425e7eff25c7e350614a4c0cad8" + integrity sha512-Vn0G6Wi+/JJ7vFgSkt5sRtdWBWdBQSncwH+kI2O1F0GvhJTrf1eDQ8XTk2yZiOD8oFLgt8mnJzTVzJbs3RqR+Q== + dependencies: + "@angular-devkit/core" "~10.0.3" + "@angular-devkit/schematics" "~10.0.3" + got "^11.5.2" + jsonc-parser "^2.3.0" + typescript "~3.9.2" + +"@abp/ng.setting-management@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@abp/ng.setting-management/-/ng.setting-management-3.1.0.tgz#eebb1c7bdfd75a04cba4c1f8d0f5cfc306a64f43" + integrity sha512-jPBn9vpDHqCDscyo445MWdCd/C0pR+WEnXPxCu7lCOs+ry1n16etoWuLAIfI2LtpI0+g8AgMyL3hacP0MPzpGg== + dependencies: + "@abp/ng.theme.shared" "~3.1.0" + tslib "^2.0.0" + +"@abp/ng.tenant-management@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management/-/ng.tenant-management-3.1.0.tgz#d0b58b711269d91530f36f8ddcb3f6d8f80c0927" + integrity sha512-//g3O2b2NvV7NQtEydbrhZqkdyS3FccVs6wX204ylTLCaLDAwneqNnAnSCQHnUI9GNMjBpj3/VFRGBlvGeW+tw== + dependencies: + "@abp/ng.feature-management" "~3.1.0" + "@abp/ng.theme.shared" "~3.1.0" + tslib "^2.0.0" + +"@abp/ng.theme.basic@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@abp/ng.theme.basic/-/ng.theme.basic-3.1.0.tgz#53db1e40ed4bf34d2efdc4a990ce9838f61b8d5e" + integrity sha512-C2yXYoSApLzUaOiLAAfFGEkAAP59KHJXaJTG2tsyGAsf+H2yFp2sQW+R0i59opmhW3LUXpAZV9aHKk++w+CGcQ== + dependencies: + "@abp/ng.theme.shared" "~3.1.0" + tslib "^2.0.0" + +"@abp/ng.theme.shared@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@abp/ng.theme.shared/-/ng.theme.shared-3.1.0.tgz#12fc8fb84b27c74603945dc5384afcf62bb985b6" + integrity sha512-cknvClcDbaCrfTagNuojRbOG88NYCLDEPOOrXdTcSKfieJM2L7w/Ku2piqneV17CCM51Ce7Tl1BO7osYtxTS9Q== + dependencies: + "@abp/ng.core" "~3.1.0" + "@fortawesome/fontawesome-free" "^5.14.0" + "@ng-bootstrap/ng-bootstrap" "^7.0.0" + "@ngx-validate/core" "^0.0.11" + "@swimlane/ngx-datatable" "^17.1.0" + bootstrap "^4.5.0" + chart.js "^2.9.3" + tslib "^2.0.0" + +"@abp/utils@^3.1.0-rc.4": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-3.1.0.tgz#ccbfed6591ab11466bf3fed740c8422acf6a84df" + integrity sha512-I5yjM1ovqcpBAT2LFOfwLibVE0Ql6XbP3tQj6YMEZ/foDXekn/4P6Spgq5DTZCMo+0jskS0D8NfL7Ce4p89buw== + dependencies: + just-compare "^1.3.0" + +"@angular-devkit/architect@0.1000.8": + version "0.1000.8" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1000.8.tgz#dac11e07877145056ca6d22319f2a859bab6720d" + integrity sha512-2AqPbiEugtPxNz4MGhLh+imUVelhW9h1cdJs2AbxZosIxftPb5DNDQUSAwVmRGp4CtcXVrlvcDwc0f4Fw1aiIA== + dependencies: + "@angular-devkit/core" "10.0.8" + rxjs "6.5.5" + +"@angular-devkit/build-angular@~0.1000.6": + version "0.1000.8" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.1000.8.tgz#28744499b59d85e6d16b27f3ee09e4d86c5770fe" + integrity sha512-wwDN2oadQvYPL7lDmvGsoWQjW++0ZnxWk1QVlABGhBSIs8Uxs26Hjd5YNUSsvJavBkqb1UZIOilqzb4dig5MIA== + dependencies: + "@angular-devkit/architect" "0.1000.8" + "@angular-devkit/build-optimizer" "0.1000.8" + "@angular-devkit/build-webpack" "0.1000.8" + "@angular-devkit/core" "10.0.8" + "@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" "10.0.8" + ajv "6.12.3" + autoprefixer "9.8.0" + babel-loader "8.1.0" + browserslist "^4.9.1" + cacache "15.0.3" + caniuse-lite "^1.0.30001032" + circular-dependency-plugin "5.2.0" + copy-webpack-plugin "6.0.3" + core-js "3.6.4" + 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 "26.0.0" + karma-source-map-support "1.4.0" + 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.4" + parse5 "4.0.0" + pnp-webpack-plugin "1.6.4" + postcss "7.0.31" + postcss-import "12.0.1" + postcss-loader "3.0.0" + raw-loader "4.0.1" + regenerator-runtime "0.13.5" + resolve-url-loader "3.1.1" + rimraf "3.0.2" + rollup "2.10.9" + rxjs "6.5.5" + sass "1.26.5" + sass-loader "8.0.2" + semver "7.3.2" + source-map "0.7.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.7.0" + terser-webpack-plugin "3.0.1" + tree-kill "1.2.2" + 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.1" + worker-plugin "4.0.3" + +"@angular-devkit/build-ng-packagr@~0.1000.6": + version "0.1000.8" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.1000.8.tgz#092805975248203043f0fbaf7a723be90bcdcbf0" + integrity sha512-sif0JkCjghhtHpxFfb2fJ6MnlyJXxhaWxswxnFSNQd9uLEr101AC7Ep0aDRnSJ2JUoSk1nlZnVtDqYUYAYexWw== + dependencies: + "@angular-devkit/architect" "0.1000.8" + rxjs "6.5.5" + +"@angular-devkit/build-optimizer@0.1000.8": + version "0.1000.8" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.1000.8.tgz#55023cf9e16813cc01b255e99fabb92426eeb632" + integrity sha512-esODHuTGEEMx1SmLUq03VAMly8gZUd1vRuvZeKS5HqKwDg8ZzcI7/25BuuUSlyST+6BEdjo2gnmagQnG0VBdQw== + dependencies: + loader-utils "2.0.0" + source-map "0.7.3" + tslib "2.0.0" + webpack-sources "1.4.3" + +"@angular-devkit/build-webpack@0.1000.8": + version "0.1000.8" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1000.8.tgz#048bd8e2db19b42cb3913dd2959dcd2589e5ec10" + integrity sha512-y/U+dV5N8W7KECncGSKQWoUH/DFNZCseczyl6LAd8bc0fMr8Z0TAIe8OXj+5CSRRdejWfRIxGtNWM+L2kTCU8A== + dependencies: + "@angular-devkit/architect" "0.1000.8" + "@angular-devkit/core" "10.0.8" + rxjs "6.5.5" + +"@angular-devkit/core@10.0.8", "@angular-devkit/core@~10.0.3": + version "10.0.8" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-10.0.8.tgz#ca4ea9f464cfa7ff17e2dab3bcd4c59da1ea450d" + integrity sha512-d9S8VQuqaYg0c/Y2kl/MtICtZ+UKlH5bLm8y2fb2WfSL4A5XIqMGdEVxzFSiR0b1Bnt4NAoQMcBec1blHAqMSQ== + dependencies: + ajv "6.12.3" + fast-json-stable-stringify "2.1.0" + magic-string "0.25.7" + rxjs "6.5.5" + source-map "0.7.3" + +"@angular-devkit/schematics@10.0.8", "@angular-devkit/schematics@~10.0.3": + version "10.0.8" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-10.0.8.tgz#6064d6323a1c9abc195e67ae4c88e373ce36b5e2" + integrity sha512-p2PjvrExuzOe/azyOEcBeIgwZIk4D6VeLkJf/KVjhXOVu13pjIXHX7/qWl+IYnbtj3NZGHqXM5Cr8nxsJNIMpw== + dependencies: + "@angular-devkit/core" "10.0.8" + ora "4.0.4" + rxjs "6.5.5" + +"@angular/animations@~10.0.10": + version "10.0.14" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-10.0.14.tgz#8e7fa9b26c70cf8e67ec0cc943211eb3957dda8c" + integrity sha512-0BOGQOuaudIG0pq6FAnG55teKM7tEQZdIwdoOf0okhh9n0cFWSWRUjvUxWt25bWswlO+HxELyJioiRUvVSES4g== + dependencies: + tslib "^2.0.0" + +"@angular/cli@~10.0.6": + version "10.0.8" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-10.0.8.tgz#133f1ea23e622923fd5dae27f5689379cfacaad3" + integrity sha512-unTteffLepsFw7qQulHOLLyLqCpQMOaZo0WO4x6cQGcW2mc0WgwnwBW2JDYMx1U2434t/Q13LqYMPNYWyCGsog== + dependencies: + "@angular-devkit/architect" "0.1000.8" + "@angular-devkit/core" "10.0.8" + "@angular-devkit/schematics" "10.0.8" + "@schematics/angular" "10.0.8" + "@schematics/update" "0.1000.8" + "@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.1.0" + open "7.0.4" + pacote "9.5.12" + read-package-tree "5.3.1" + rimraf "3.0.2" + semver "7.3.2" + symbol-observable "1.2.0" + universal-analytics "0.4.20" + uuid "8.1.0" + +"@angular/common@~10.0.10": + version "10.0.14" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-10.0.14.tgz#a08228323609a22559590f4295b26f247f7438f4" + integrity sha512-EOAuaMt2HwJF3DtIJ/ksHtnF8Pqh5K2rWISYLEs9R3WNaSGn74kbCODAT4pNhI8P22Ykl3H4FmQUgnDZ3uDAUg== + dependencies: + tslib "^2.0.0" + +"@angular/compiler-cli@~10.0.10": + version "10.0.14" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-10.0.14.tgz#0da5f62a3f62b4b36c8fcecf70baaaedbc84ab93" + integrity sha512-WK+S90sjc+3iMo8/CuuAX0RdGFwyA9esqqC5fYG/MDZjKuPuhogiimmR0rY3P1Th7B9di8x012xiILbf4GsGUQ== + dependencies: + canonical-path "1.0.0" + chokidar "^3.0.0" + convert-source-map "^1.5.1" + dependency-graph "^0.7.2" + fs-extra "4.0.2" + magic-string "^0.25.0" + minimist "^1.2.0" + reflect-metadata "^0.1.2" + semver "^6.3.0" + source-map "^0.6.1" + sourcemap-codec "^1.4.8" + tslib "^2.0.0" + yargs "15.3.0" + +"@angular/compiler@~10.0.10": + version "10.0.14" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-10.0.14.tgz#0a766786eaa8817137bda17b7e509efac385582d" + integrity sha512-lYNo6/MmnYAVFoDQDBB6HMFd9zHg3RHXc6hn+wchU0XSWiIsg6WYHbKOb/DyqUEyKebzy0gSKZf7gUeZHtj62Q== + dependencies: + tslib "^2.0.0" + +"@angular/core@~10.0.10": + version "10.0.14" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-10.0.14.tgz#000f091e6c17239232120fdca871fdac6b529ebd" + integrity sha512-m+c9g6fA/gE+6K7It01b6r8TEmbuFjUZajQ9gG/pzist0mTBcqfvn0O4h5X+ebnSgw/bbnnp+4PbaXEi1pOWZQ== + dependencies: + tslib "^2.0.0" + +"@angular/forms@~10.0.10": + version "10.0.14" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-10.0.14.tgz#b6e1a7f872c318039be21b0a11839c8df063f0a3" + integrity sha512-McKh3rXDlAE7qmCnyWKENb2HhqAT+1dsAfChuqs0w8jhKkoRgA00RDFee6dZ6XQCc907DwuV0K8+wC3CvBp35w== + dependencies: + tslib "^2.0.0" + +"@angular/language-service@~10.0.10": + version "10.0.14" + resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-10.0.14.tgz#b9c33d27dcd11e2bb0c5453df1e7b334a0896a94" + integrity sha512-QQLYUjD0T6u2hLNYXUEUbupAGsz5egmhCAckaQojvXCe3SLL/hQsrK4odrNuspy7TvMB0H5ZNEHGlF6m/WLZ3g== + +"@angular/localize@~10.0.10": + version "10.0.14" + resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-10.0.14.tgz#99064a3b12e94e54e791c0638fbbbcc8783d8a62" + integrity sha512-tV1oUii6bxpQ6bKELcZsibUEEGmNiROxy8xRW015VgrgMFhuNuesHSmNUIstZ7ag8/sjh0/w1p55PUB6LEiPFA== + dependencies: + "@babel/core" "7.8.3" + glob "7.1.2" + yargs "15.3.0" + +"@angular/platform-browser-dynamic@~10.0.10": + version "10.0.14" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.0.14.tgz#4ee2257b2ccb94949f0a8083884020a814b5d47c" + integrity sha512-PPCAiNh/JSuQNKXOhj3a8CTFdVhTgF/EpGtaotnVr/BfbJMeFImKo7m2QQOTsAFaEP2DurSHnofPnMWAfHS2mg== + dependencies: + tslib "^2.0.0" + +"@angular/platform-browser@~10.0.10": + version "10.0.14" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-10.0.14.tgz#43b9aa7fcd8f312b58f371206df265c31ea13fac" + integrity sha512-DcBZ1wt2TwtXrdcmCTWanAzu2Vxk5Uvioam0UcDxcgXD84T2fHipyfZVn07fMqRvzFQj45tDNAEevFBnGZar4w== + dependencies: + tslib "^2.0.0" + +"@angular/router@~10.0.10": + version "10.0.14" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-10.0.14.tgz#e8942e93a8154e1be749e1f9d79afa5f7b5b9cb9" + integrity sha512-VWzaNyPZDY99TMszV1GlXJgVOxXsjhJrsv3mIcjaz1dfdlKOeKTVDLdnyXfP9CkwE3PRmvG7eSXppIj6nn9BpQ== + dependencies: + tslib "^2.0.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/compat-data@^7.10.4", "@babel/compat-data@^7.9.6": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.11.0.tgz#e9f73efe09af1355b723a7f39b11bad637d7c99c" + integrity sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ== + dependencies: + browserslist "^4.12.0" + invariant "^2.2.4" + semver "^5.5.0" + +"@babel/core@7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.3.tgz#30b0ebb4dd1585de6923a0b4d179e0b9f5d82941" + integrity sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.8.3" + "@babel/helpers" "^7.8.3" + "@babel/parser" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.0" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@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.6" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helpers" "^7.9.6" + "@babel/parser" "^7.9.6" + "@babel/template" "^7.8.6" + "@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" + json5 "^2.1.2" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.7.5": + version "7.11.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.6.tgz#3a9455dc7387ff1bac45770650bc13ba04a15651" + integrity sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.11.6" + "@babel/helper-module-transforms" "^7.11.0" + "@babel/helpers" "^7.10.4" + "@babel/parser" "^7.11.5" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.11.5" + "@babel/types" "^7.11.5" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@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.6" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/generator@^7.11.5", "@babel/generator@^7.11.6", "@babel/generator@^7.8.3", "@babel/generator@^7.9.6": + version "7.11.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.6.tgz#b868900f81b163b4d464ea24545c61cbac4dc620" + integrity sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA== + dependencies: + "@babel/types" "^7.11.5" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" + integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" + integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-compilation-targets@^7.9.6": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2" + integrity sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ== + dependencies: + "@babel/compat-data" "^7.10.4" + browserslist "^4.12.0" + invariant "^2.2.4" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/helper-create-regexp-features-plugin@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8" + integrity sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-regex" "^7.10.4" + regexpu-core "^4.7.0" + +"@babel/helper-define-map@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" + integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/types" "^7.10.5" + lodash "^4.17.19" + +"@babel/helper-explode-assignable-expression@^7.10.4": + version "7.11.4" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz#2d8e3470252cc17aba917ede7803d4a7a276a41b" + integrity sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" + integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== + dependencies: + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-get-function-arity@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" + integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-hoist-variables@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" + integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-member-expression-to-functions@^7.10.4": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" + integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== + dependencies: + "@babel/types" "^7.11.0" + +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" + integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.11.0", "@babel/helper-module-transforms@^7.9.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" + integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/template" "^7.10.4" + "@babel/types" "^7.11.0" + lodash "^4.17.19" + +"@babel/helper-optimise-call-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" + integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-regex@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0" + integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg== + dependencies: + lodash "^4.17.19" + +"@babel/helper-remap-async-to-generator@^7.10.4": + version "7.11.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz#4474ea9f7438f18575e30b0cac784045b402a12d" + integrity sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-wrap-function" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-replace-supers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" + integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-simple-access@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" + integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== + dependencies: + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-skip-transparent-expression-wrappers@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz#eec162f112c2f58d3af0af125e3bb57665146729" + integrity sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q== + dependencies: + "@babel/types" "^7.11.0" + +"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" + integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== + dependencies: + "@babel/types" "^7.11.0" + +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + +"@babel/helper-wrap-function@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" + integrity sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helpers@^7.10.4", "@babel/helpers@^7.8.3", "@babel/helpers@^7.9.6": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" + integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== + dependencies: + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.10.4", "@babel/parser@^7.11.5", "@babel/parser@^7.8.3", "@babel/parser@^7.8.6", "@babel/parser@^7.9.6": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037" + integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q== + +"@babel/plugin-proposal-async-generator-functions@^7.8.3": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz#3491cabf2f7c179ab820606cec27fed15e0e8558" + integrity sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.10.4" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-dynamic-import@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e" + integrity sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-json-strings@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db" + integrity sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a" + integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06" + integrity sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.9.6": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af" + integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.10.4" + +"@babel/plugin-proposal-optional-catch-binding@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd" + integrity sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.9.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz#de5866d0646f6afdaab8a566382fe3a221755076" + integrity sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" + "@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": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d" + integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-async-generators@^7.8.0": + 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-dynamic-import@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-json-strings@^7.8.0": + 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-nullish-coalescing-operator@^7.8.0": + 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.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.0": + 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.0": + 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.0": + 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/plugin-syntax-top-level-await@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz#4bbeb8917b54fcf768364e0a81f560e33a3ef57d" + integrity sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-arrow-functions@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz#e22960d77e697c74f41c501d44d73dbf8a6a64cd" + integrity sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-async-to-generator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37" + integrity sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.10.4" + +"@babel/plugin-transform-block-scoped-functions@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8" + integrity sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-block-scoping@^7.8.3": + version "7.11.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz#5b7efe98852bef8d652c0b28144cd93a9e4b5215" + integrity sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-classes@^7.9.5": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7" + integrity sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-define-map" "^7.10.4" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb" + integrity sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-destructuring@^7.9.5": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5" + integrity sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee" + integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-duplicate-keys@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47" + integrity sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-exponentiation-operator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e" + integrity sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-for-of@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz#c08892e8819d3a5db29031b115af511dbbfebae9" + integrity sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-function-name@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7" + integrity sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-literals@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c" + integrity sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7" + integrity sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-modules-amd@^7.9.6": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1" + integrity sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw== + dependencies: + "@babel/helper-module-transforms" "^7.10.5" + "@babel/helper-plugin-utils" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.9.6": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0" + integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w== + dependencies: + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.9.6": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85" + integrity sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw== + dependencies: + "@babel/helper-hoist-variables" "^7.10.4" + "@babel/helper-module-transforms" "^7.10.5" + "@babel/helper-plugin-utils" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e" + integrity sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA== + dependencies: + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6" + integrity sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + +"@babel/plugin-transform-new-target@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888" + integrity sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-object-super@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894" + integrity sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + +"@babel/plugin-transform-parameters@^7.10.4", "@babel/plugin-transform-parameters@^7.9.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz#59d339d58d0b1950435f4043e74e2510005e2c4a" + integrity sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw== + dependencies: + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-property-literals@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0" + integrity sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-regenerator@^7.8.7": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz#2015e59d839074e76838de2159db421966fd8b63" + integrity sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd" + integrity sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@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.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6" + integrity sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-spread@^7.8.3": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz#fa84d300f5e4f57752fe41a6d1b3c554f13f17cc" + integrity sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" + +"@babel/plugin-transform-sticky-regex@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d" + integrity sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-regex" "^7.10.4" + +"@babel/plugin-transform-template-literals@^7.8.3": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz#78bc5d626a6642db3312d9d0f001f5e7639fde8c" + integrity sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-typeof-symbol@^7.8.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc" + integrity sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-unicode-regex@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz#e56d71f9282fac6db09c82742055576d5e6d80a8" + integrity sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@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.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" + "@babel/plugin-proposal-dynamic-import" "^7.8.3" + "@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.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" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.8.3" + "@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.5" + "@babel/plugin-transform-computed-properties" "^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" + "@babel/plugin-transform-for-of" "^7.9.0" + "@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.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.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" + "@babel/plugin-transform-shorthand-properties" "^7.8.3" + "@babel/plugin-transform-spread" "^7.8.3" + "@babel/plugin-transform-sticky-regex" "^7.8.3" + "@babel/plugin-transform-template-literals" "^7.8.3" + "@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.6" + browserslist "^4.11.1" + core-js-compat "^3.6.2" + invariant "^2.2.2" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" + integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@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.8.4": + version "7.11.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" + integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" + integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/parser" "^7.8.6" + "@babel/types" "^7.8.6" + +"@babel/template@^7.10.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" + integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5", "@babel/traverse@^7.8.3", "@babel/traverse@^7.9.6": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3" + integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.11.5" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/parser" "^7.11.5" + "@babel/types" "^7.11.5" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + +"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.11.5", "@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.6": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d" + integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@fortawesome/fontawesome-free@^5.14.0": + version "5.14.0" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.14.0.tgz#a371e91029ebf265015e64f81bfbf7d228c9681f" + integrity sha512-OfdMsF+ZQgdKHP9jUbmDcRrP0eX90XXrsXIdyjLbkmSBzmMXPABB8eobUJtivaupucYaByz6WNe1PI1JuYm3qA== + +"@istanbuljs/schema@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" + integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== + +"@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" + integrity sha512-TAdNkeGB5Fe4Og+ZkAr1Kvn9by2sfL44IAHFtxlh1BA1XJ5cLpO9iSNki5opWESv3l3vSHsZ9BNKuqFKbEbFaA== + dependencies: + convert-source-map "^1.7.0" + istanbul-lib-instrument "^4.0.1" + loader-utils "^1.4.0" + merge-source-map "^1.1.0" + schema-utils "^2.6.4" + +"@ng-bootstrap/ng-bootstrap@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-7.0.0.tgz#3bfa62eb52fdb891b1ce693ea11c39127e2d1ab7" + integrity sha512-SxUaptGWJmCxM0d2Zy1mx7K7p/YBwGZ69NmmBQVY4BE6p5av0hWrVmv9rzzfBz0rhxU7RPZLor2Jpaoq8Xyl4w== + dependencies: + tslib "^2.0.0" + +"@ngtools/webpack@10.0.8": + version "10.0.8" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-10.0.8.tgz#c818415a150ff6d578b25311b97859220b9d5a10" + integrity sha512-Qv4v7O4VGeWuXjRThd/mdC2I4cJOgQ7kDrVN7vkDB2EW5xtRB+/4hghvFeO3bD11FLuFvCxBMb0HbwyKoVQgEQ== + dependencies: + "@angular-devkit/core" "10.0.8" + enhanced-resolve "4.1.1" + rxjs "6.5.5" + webpack-sources "1.4.3" + +"@ngx-validate/core@^0.0.11": + version "0.0.11" + resolved "https://registry.yarnpkg.com/@ngx-validate/core/-/core-0.0.11.tgz#bec771546a09f2a5f44305fcdd1186851b4df152" + integrity sha512-eUoARAyyLE3Gd+PjDSWypJIPDqudPNInaaZdpPWhqAseecRtejLGD33f211Se3E0IZpnLhQAAOnM9hFfpNpr9w== + dependencies: + tslib "^1.9.0" + +"@ngxs/router-plugin@^3.6.2": + version "3.6.2" + resolved "https://registry.yarnpkg.com/@ngxs/router-plugin/-/router-plugin-3.6.2.tgz#058b09565011203bbf52294f16f29f9337aeaa27" + integrity sha512-5J3G9+Qsy/s7iqFivzAN1S6EmaZYTb9hqz7Xjn3c0u3Y44VMP5VWiz77jZ/eowXX0slJywcMxk6oCEFPwz4lXQ== + dependencies: + tslib "^1.9.0" + +"@ngxs/storage-plugin@^3.6.2": + version "3.6.2" + resolved "https://registry.yarnpkg.com/@ngxs/storage-plugin/-/storage-plugin-3.6.2.tgz#6fe2168891382c635406df02308f67b585efc60a" + integrity sha512-x9CATYmXDH9bWmKW4uQxt5xxb51naSAmMkhvv1QHIrE9hG4uYNqiV3ERAM1wZvZbu2MJB9iXEN0cBziTgrwe2Q== + dependencies: + tslib "^1.9.0" + +"@ngxs/store@^3.6.2": + version "3.6.2" + resolved "https://registry.yarnpkg.com/@ngxs/store/-/store-3.6.2.tgz#cfba63dc1e5bd422e89e54b3332cd69818510624" + integrity sha512-al7GU618SAuz2Ul4rFYVDgS1DM0gHReGOGvbnE7LBt4Etz3gsJERNYXPp2bSA7lZGaRPRaFfIHJN+Lm/GikFJw== + dependencies: + tslib "^1.9.0" + +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== + dependencies: + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" + +"@npmcli/move-file@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.0.1.tgz#de103070dac0f48ce49cf6693c23af59c0f70464" + integrity sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw== + dependencies: + mkdirp "^1.0.4" + +"@rollup/plugin-commonjs@^15.0.0": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-15.0.0.tgz#690d15a9d54ba829db93555bff9b98ff34e08574" + integrity sha512-8uAdikHqVyrT32w1zB9VhW6uGwGjhKgnDNP4pQJsjdnyF4FgCj6/bmv24c7v2CuKhq32CcyCwRzMPEElaKkn0w== + dependencies: + "@rollup/pluginutils" "^3.1.0" + commondir "^1.0.1" + estree-walker "^2.0.1" + glob "^7.1.6" + is-reference "^1.2.1" + magic-string "^0.25.7" + resolve "^1.17.0" + +"@rollup/plugin-json@^4.0.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-4.1.0.tgz#54e09867ae6963c593844d8bd7a9c718294496f3" + integrity sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw== + dependencies: + "@rollup/pluginutils" "^3.0.8" + +"@rollup/plugin-node-resolve@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-9.0.0.tgz#39bd0034ce9126b39c1699695f440b4b7d2b62e6" + integrity sha512-gPz+utFHLRrd41WMP13Jq5mqqzHL3OXrfj3/MkSyB6UBIcuNt9j60GCbarzMzdf1VHFpOxfQh/ez7wyadLMqkg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + builtin-modules "^3.1.0" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.17.0" + +"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.0.9", "@rollup/pluginutils@^3.1.0": + 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.8": + version "10.0.8" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-10.0.8.tgz#af730827b2de6cab7561157a8772250eb5f277e1" + integrity sha512-KNO61UGtiKMQSG+NbusqLtwLbxId0y+xpXJt9PKFwi+vaViOO+YzOPREfiFCuQ7q6X8SmNlrMj6sZ34E2YN1pQ== + dependencies: + "@angular-devkit/core" "10.0.8" + "@angular-devkit/schematics" "10.0.8" + +"@schematics/update@0.1000.8": + version "0.1000.8" + resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.1000.8.tgz#3b745ec14e92cfd1f7d16f9a4c3864e1f12249c9" + integrity sha512-xHuj6ME3PNTsVUrpftd98LF3WHPM0NU25GcT/n0E/j0/52yDTiaPS3wUnYSK8ZSv4Et4hcyGx7f/LEXAoOKJXw== + dependencies: + "@angular-devkit/core" "10.0.8" + "@angular-devkit/schematics" "10.0.8" + "@yarnpkg/lockfile" "1.1.0" + ini "1.3.5" + npm-package-arg "^8.0.0" + pacote "9.5.12" + rxjs "6.5.5" + semver "7.3.2" + semver-intersect "1.4.0" + +"@sindresorhus/is@^3.1.1": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-3.1.2.tgz#548650de521b344e3781fbdb0ece4aa6f729afb8" + integrity sha512-JiX9vxoKMmu8Y3Zr2RVathBL1Cdu4Nt4MuNWemt1Nc06A0RAin9c5FArkhGsyMBWfCu4zj+9b+GxtjAnE4qqLQ== + +"@swimlane/ngx-datatable@^17.1.0": + version "17.1.0" + resolved "https://registry.yarnpkg.com/@swimlane/ngx-datatable/-/ngx-datatable-17.1.0.tgz#ef2f91c3783526e7e89ac7a62a53e7bc9e1c90d5" + integrity sha512-zYUS7uNO9OJ5UQZFuuTRjlPu6vdKA+FHYLfeEs7PgSuUiDCcbl2SWoUdS/3zIoWn/qQyws767ueWiAvvWUbpEw== + +"@szmarczak/http-timer@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.5.tgz#bfbd50211e9dfa51ba07da58a14cdfd333205152" + integrity sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ== + dependencies: + defer-to-connect "^2.0.0" + +"@types/cacheable-request@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976" + integrity sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "*" + "@types/node" "*" + "@types/responselike" "*" + +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + +"@types/estree@*": + version "0.0.45" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.45.tgz#e9387572998e5ecdac221950dab3e8c3b16af884" + integrity sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/glob@^7.1.1": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" + integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/http-cache-semantics@*": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a" + integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A== + +"@types/jasmine@*", "@types/jasmine@~3.5.0": + version "3.5.14" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.5.14.tgz#f41a14e8ffa939062a71cf9722e5ee7d4e1f94af" + integrity sha512-Fkgk536sHPqcOtd+Ow+WiUNuk0TSo/BntKkF8wSvcd6M2FvPjeXcUE6Oz/bwDZiUZEaXLslAgw00Q94Pnx6T4w== + +"@types/jasminewd2@~2.0.3": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@types/jasminewd2/-/jasminewd2-2.0.8.tgz#67afe5098d5ef2386073a7b7384b69a840dfe93b" + integrity sha512-d9p31r7Nxk0ZH0U39PTH0hiDlJ+qNVGjlt1ucOoTUptxb2v+Y5VMnsxfwN+i3hK4yQnqBi3FMmoMFcd1JHDxdg== + dependencies: + "@types/jasmine" "*" + +"@types/json-schema@^7.0.5": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" + integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== + +"@types/keyv@*": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.1.tgz#e45a45324fca9dab716ab1230ee249c9fb52cfa7" + integrity sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw== + dependencies: + "@types/node" "*" + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*": + version "14.6.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.4.tgz#a145cc0bb14ef9c4777361b7bbafa5cf8e3acb5a" + integrity sha512-Wk7nG1JSaMfMpoMJDKUsWYugliB2Vy55pdjLpmLixeyMi7HizW2I/9QoxsPCkXl3dO+ZOVqPumKaDUv5zJu2uQ== + +"@types/node@^12.11.1": + version "12.12.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.55.tgz#0aa266441cb9e1fd3e415a8f619cb7d776667cdd" + integrity sha512-Vd6xQUVvPCTm7Nx1N7XHcpX6t047ltm7TgcsOr4gFHjeYgwZevo+V7I1lfzHnj5BT5frztZ42+RTG4MwYw63dw== + +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + 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/q@^0.0.32": + version "0.0.32" + 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@1.17.1": + version "1.17.1" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + dependencies: + "@types/node" "*" + +"@types/responselike@*", "@types/responselike@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" + integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== + dependencies: + "@types/node" "*" + +"@types/selenium-webdriver@^3.0.0": + version "3.0.17" + resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz#50bea0c3c2acc31c959c5b1e747798b3b3d06d4b" + integrity sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw== + +"@types/source-list-map@*": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" + integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== + +"@types/webpack-sources@^0.1.5": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.8.tgz#078d75410435993ec8a0a2855e88706f3f751f81" + integrity sha512-JHB2/xZlXOjzjBB6fMOpH1eQAfsrpqVVIbneE0Rok16WXwFaznaI5vfg75U5WgGJm7V9W1c4xeRQDjX/zwvghA== + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.6.1" + +"@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.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.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.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.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +"@yarnpkg/lockfile@1.1.0": + version "1.1.0" + 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.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.4.tgz#6dfa57b417ca06d21b2478f0e638302f99c2405c" + integrity sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn@^6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + +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" + integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== + +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= + +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" + +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: + es6-promisify "^5.0.0" + +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: + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@6.12.3: + version "6.12.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" + integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== + 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" + +ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4: + version "6.12.4" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234" + integrity sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ== + 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= + +angular-oauth2-oidc@^10.0.0: + version "10.0.3" + resolved "https://registry.yarnpkg.com/angular-oauth2-oidc/-/angular-oauth2-oidc-10.0.3.tgz#612ef75c2e07b56592d2506f9618ee6a61857ad9" + integrity sha512-9wC8I3e3cN6rMBOlo5JB2y3Fd2erp8pJ67t4vEVzyPbnRG6BJ4rreSOznSL9zw/2SjhC9kRV2OfFie29CUCzEg== + dependencies: + tslib "^2.0.0" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + +ansi-escapes@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +app-root-path@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.2.1.tgz#d0df4a682ee408273583d43f6f79e9892624bc9a" + integrity sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA== + +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +aria-query@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" + integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= + dependencies: + 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" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +arraybuffer.slice@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" + integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asap@^2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "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" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-types-flow@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + +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== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +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== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +atob@^2.1.2: + version "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.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.12.0" + caniuse-lite "^1.0.30001061" + chalk "^2.4.2" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.30" + postcss-value-parser "^4.1.0" + +autoprefixer@^9.6.5: + version "9.8.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" + integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + colorette "^1.2.1" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428" + integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA== + +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" + +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.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" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-arraybuffer@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= + +base64-js@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base64id@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +better-assert@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= + dependencies: + callsite "1.0.0" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" + integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +blob@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" + integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== + +blocking-proxy@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-1.0.1.tgz#81d6fd1fe13a4c0d6957df7f91b75e98dac40cb2" + integrity sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA== + 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== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== + +bn.js@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" + integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== + +body-parser@1.19.0, body-parser@^1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +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= + +bootstrap@^4.5.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.5.2.tgz#a85c4eda59155f0d71186b6e6ad9b875813779ab" + integrity sha512-vlGn0bcySYl/iV+BGA544JkkZP5LB3jsmkeKLFQakCOwCM3AOk7VkldBz4jrzSe+Z0Ezn99NVXa1o45cQY4R6A== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +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== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +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.14.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.1.tgz#cb2b490ba881d45dc3039078c7ed04411eaf3fa3" + integrity sha512-zyBTIHydW37pnb63c7fHFXUG6EcqWOqoMdDx6cdyaDFriZ20EoVxcE95S54N+heRqY8m8IUgB5zYta/gCwSaaA== + dependencies: + caniuse-lite "^1.0.30001124" + electron-to-chromium "^1.3.562" + escalade "^3.0.2" + node-releases "^1.1.60" + +browserstack@^1.5.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/browserstack/-/browserstack-1.6.0.tgz#5a56ab90987605d9c138d7a8b88128370297f9bf" + integrity sha512-HJDJ0TSlmkwnt9RZ+v5gFpa1XZTBYTj0ywvLwJ3241J7vMw2jAsGNVhKHtmCOyg+VxeLZyaibO9UL71AsUeDIw== + dependencies: + https-proxy-agent "^2.2.1" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-modules@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= + +builtin-modules@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" + integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw== + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +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 "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + 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" + move-file "^2.0.0" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.0" + tar "^6.0.2" + unique-filename "^1.1.1" + +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: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cacache@^15.0.3, cacache@^15.0.4: + version "15.0.5" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.5.tgz#69162833da29170d6732334643c60e005f5f17d0" + integrity sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A== + dependencies: + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.0" + tar "^6.0.2" + unique-filename "^1.1.1" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cacheable-lookup@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.3.tgz#049fdc59dffdd4fc285e8f4f82936591bd59fec3" + integrity sha512-W+JBqF9SWe18A72XFzN/V/CULFzPm7sBXzzR6ekkE+3tLG72wFZrBiBZhrZuDoYexop4PHJVdFAKb/Nj9+tm9w== + +cacheable-request@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.1.tgz#062031c2856232782ed694a257fa35da93942a58" + integrity sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^2.0.0" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsite@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +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== + +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.30001032, caniuse-lite@^1.0.30001061, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001124: + version "1.0.30001124" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001124.tgz#5d9998190258e11630d674fc50ea8e579ae0ced2" + integrity sha512-zQW8V3CdND7GHRH6rxm6s59Ww4g/qGWTheoboW9nfeMg7sUoopIfKCcNZUjwYRCOrvereh3kwDpZj4VLQ7zGtA== + +canonical-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/canonical-path/-/canonical-path-1.0.0.tgz#fcb470c23958def85081856be7a86e904f180d1d" + integrity sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1, 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== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.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 "^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" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chart.js@^2.9.3: + version "2.9.3" + resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-2.9.3.tgz#ae3884114dafd381bc600f5b35a189138aac1ef7" + integrity sha512-+2jlOobSk52c1VU6fzkh3UwqHMdSlgH1xFv9FKMqHiNCpXsGPQa/+81AFa+i3jZ253Mq9aAycPwDjnn1XbRNNw== + dependencies: + chartjs-color "^2.1.0" + moment "^2.10.2" + +chartjs-color-string@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz#1df096621c0e70720a64f4135ea171d051402f71" + integrity sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A== + dependencies: + color-name "^1.0.0" + +chartjs-color@^2.1.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chartjs-color/-/chartjs-color-2.4.1.tgz#6118bba202fe1ea79dd7f7c0f9da93467296c3b0" + integrity sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w== + dependencies: + chartjs-color-string "^0.6.0" + color-convert "^1.9.3" + +"chokidar@>=2.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.2.1, chokidar@^3.4.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" + integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.4.0" + optionalDependencies: + fsevents "~2.1.2" + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +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== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +circular-dependency-plugin@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz#e09dbc2dd3e2928442403e2d45b41cea06bc0a93" + integrity sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +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-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.2.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.4.0.tgz#c6256db216b878cfba4720e719cec7cf72685d7f" + integrity sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA== + +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +clone@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +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" + integrity sha512-jB4FZ1Sx7kZhvZVdf+N2BaKTdrrNZOL0Bj10RRfrhHrb3zEvXjJvvq298JPMJAiyiCS/v4zs1QlGU0ip7xGqeA== + dependencies: + app-root-path "^2.2.1" + aria-query "^3.0.0" + axobject-query "2.0.2" + css-selector-tokenizer "^0.7.1" + cssauron "^1.4.0" + damerau-levenshtein "^1.0.4" + semver-dsl "^1.0.1" + source-map "^0.5.7" + sprintf-js "^1.1.2" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.1, color-convert@^1.9.3: + 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== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +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" + +colorette@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== + +colors@1.4.0, colors@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +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" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +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== + +commander@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.1.0.tgz#f8d722b78103141006b66f4c7ba1e97315ba75bc" + integrity sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= + +component-emitter@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + +component-emitter@^1.2.1, component-emitter@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= + +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" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "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" + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +connect@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@1.7.0, convert-source-map@^1.5.1, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + 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" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +copy-webpack-plugin@6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.0.3.tgz#2b3d2bfc6861b96432a65f0149720adbd902040b" + integrity sha512-q5m6Vz4elsuyVEIUXr7wJdIdePWTubsqVbEMvf1WQnHGv0Q+9yPRu7MtYFPt+GBOXRav9lvIINifTQ1vSCs+eA== + dependencies: + cacache "^15.0.4" + fast-glob "^3.2.4" + find-cache-dir "^3.3.1" + glob-parent "^5.1.1" + globby "^11.0.1" + loader-utils "^2.0.0" + normalize-path "^3.0.0" + p-limit "^3.0.1" + schema-utils "^2.7.0" + serialize-javascript "^4.0.0" + webpack-sources "^1.4.3" + +core-js-compat@^3.6.2: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" + integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== + dependencies: + browserslist "^4.8.5" + semver "7.0.0" + +core-js@3.6.4: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" + integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== + +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: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +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-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" + icss-utils "^4.1.1" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.27" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.2.0" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.0.3" + schema-utils "^2.6.6" + semver "^6.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" + integrity sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q= + 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.3" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1" + integrity sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg== + dependencies: + cssesc "^3.0.0" + fastparse "^1.1.2" + +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" + integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +cssauron@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssauron/-/cssauron-1.4.0.tgz#a6602dff7e04a8306dc0db9a551e92e8b5662ad8" + integrity sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg= + dependencies: + through X.X.X + +cssesc@^3.0.0: + version "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== + +cssnano@4.1.10: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +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" + +cuint@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" + integrity sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs= + +custom-event@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +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" + integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.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" + +date-format@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.1.0.tgz#31d5b5ea211cf5fd764cd38baf9d033df7e125cf" + integrity sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA== + +date-format@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-3.0.0.tgz#eb8780365c7d2b1511078fb491e6479780f3ad95" + integrity sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w== + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +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, debug@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debuglog@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" + integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +defer-to-connect@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.0.tgz#83d6b199db041593ac84d781b5222308ccf4c2c1" + integrity sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg== + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +delayed-stream@~1.0.0: + version "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" + integrity sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ== + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-node@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + +dezalgo@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" + integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= + dependencies: + asap "^2.0.0" + wrappy "1" + +di@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +dom-serialize@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs= + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +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" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +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== + +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" + integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== + dependencies: + is-obj "^2.0.0" + +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" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "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.562: + version "1.3.562" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.562.tgz#79c20277ee1c8d0173a22af00e38433b752bc70f" + integrity sha512-WhRe6liQ2q/w1MZc8mD8INkenHivuHdrr4r5EQHNomy3NJux+incP6M6lDMd0paShP3MD0WGe5R1TWmEClf+Bg== + +elliptic@^6.5.3: + 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" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "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" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +encoding@^0.1.11: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +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" + +engine.io-client@~3.4.0: + version "3.4.3" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.4.3.tgz#192d09865403e3097e3575ebfeb3861c4d01a66c" + integrity sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw== + dependencies: + component-emitter "~1.3.0" + component-inherit "0.0.3" + debug "~4.1.0" + engine.io-parser "~2.2.0" + has-cors "1.1.0" + indexof "0.0.1" + parseqs "0.0.5" + parseuri "0.0.5" + ws "~6.1.0" + xmlhttprequest-ssl "~1.5.4" + yeast "0.1.2" + +engine.io-parser@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.0.tgz#312c4894f57d52a02b420868da7b5c1c84af80ed" + integrity sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w== + dependencies: + after "0.8.2" + arraybuffer.slice "~0.0.7" + base64-arraybuffer "0.1.5" + blob "0.0.5" + has-binary2 "~1.0.2" + +engine.io@~3.4.0: + version "3.4.2" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.4.2.tgz#8fc84ee00388e3e228645e0a7d3dfaeed5bd122c" + integrity sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg== + dependencies: + accepts "~1.3.4" + base64id "2.0.0" + cookie "0.3.1" + debug "~4.1.0" + engine.io-parser "~2.2.0" + ws "^7.1.2" + +enhanced-resolve@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" + integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +enhanced-resolve@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" + integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +ent@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= + +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" + integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= + +errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: + 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" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + 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" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + 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.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4" + integrity sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esrecurse@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +estree-walker@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.1.tgz#f8e030fb21cefa183b44b7ad516b747434e7a3e0" + integrity sha512-tF0hv+Yi2Ot1cwj9eYHtxC0jB9bmjacjQs6ZBTj82H8JwUywFuc+7E83NWfNMwHXZc11mjfFcVXPe9gEP4B8dg== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" + integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== + +eventsource@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" + integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== + dependencies: + original "^1.0.0" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + 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" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.1.1, fast-glob@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" + integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + +fast-json-stable-stringify@2.1.0, 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" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fastparse@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" + integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== + +fastq@^1.6.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" + integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.11.1: + version "0.11.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" + integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== + dependencies: + websocket-driver ">=0.5.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" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-loader@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.0.0.tgz#97bbfaab7a2460c07bcbd72d3a6922407f67649f" + integrity sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ== + dependencies: + loader-utils "^2.0.0" + schema-utils "^2.6.5" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.2, finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +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== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.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== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-parent-dir@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" + integrity sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ= + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flatted@^2.0.1, flatted@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + +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" + +follow-redirects@^1.0.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" + integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +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" + integrity sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.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" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +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== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + +function-bind@^1.1.1: + version "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" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + +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" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-stream@^4.0.0, get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +glob@7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +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, glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +got@^11.5.2: + version "11.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-11.6.0.tgz#4978c78f3cbc3a45ee95381f8bb6efd1db1f4638" + integrity sha512-ErhWb4IUjQzJ3vGs3+RR12NWlBDDkRciFpAkQ1LPUxi6OnwhGj07gQxjPsyIk69s7qMihwKrKquV6VQq7JNYLA== + dependencies: + "@sindresorhus/is" "^3.1.1" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.1" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, 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== + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-binary2@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" + integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== + dependencies: + isarray "2.0.1" + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +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" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +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== + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +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== + +hosted-git-info@^3.0.2: + version "3.0.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.5.tgz#bea87905ef7317442e8df3087faa3c842397df03" + integrity sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ== + dependencies: + lru-cache "^6.0.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +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-entities@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44" + integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +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-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-parser-js@>=0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.2.tgz#da2e31d237b393aae72ace43882dd7e270a8ff77" + integrity sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ== + +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: + agent-base "4" + debug "3.1.0" + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy@^1.17.0, http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.0-beta.5.2" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz#8b923deb90144aea65cf834b016a340fc98556f3" + integrity sha512-xYz9goEyBnC8XwXDTuC/MZ6t+MrKVQZOk4s7+PaDkwIsQd8IwqvM+0M6bA/2lvG8GHXcPdf+MejTUeO2LCPCeQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +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== + dependencies: + agent-base "^4.3.0" + debug "^3.1.0" + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= + dependencies: + ms "^2.0.0" + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + 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" + +iconv-lite@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" + integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +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" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +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== + dependencies: + minimatch "^3.0.4" + +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= + +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= + +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= + dependencies: + import-from "^2.1.0" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + integrity sha1-M1238qev/VOqpHHUuAId7ja387E= + dependencies: + resolve-from "^3.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "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= + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= + +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== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, 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== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@1.3.5, ini@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +injection-js@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/injection-js/-/injection-js-2.3.1.tgz#c6b7594ab0bd5da73eb8ea246fe19d98d74508cc" + integrity sha512-t+kpDAOL/DUZ68JncAhsb8C91qhJ6dXRMcOuvJfNA7sp63etdiQe6KQoxE/nZ5b2eTi0TQX6OothOCm89cLAJQ== + dependencies: + tslib "^1.9.3" + +inquirer@7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" + integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^3.0.0" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@1.1.5, ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +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-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +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" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arguments@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" + integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + +is-arrayish@^0.2.1: + version "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@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +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" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, 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-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" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-docker@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" + integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "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-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= + +is-path-cwd@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== + dependencies: + is-path-inside "^1.0.0" + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-reference@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + +is-regex@^1.0.4, is-regex@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== + dependencies: + has-symbols "^1.0.1" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +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" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-wsl@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isarray@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= + +isbinaryfile@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.6.tgz#edcb62b224e2b4710830b67498c8e4e5a4d2610b" + integrity sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== + +istanbul-lib-coverage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + +istanbul-lib-instrument@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + rimraf "^2.6.3" + source-map "^0.6.1" + +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" + +jasmine-core@^3.5.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.6.0.tgz#491f3bb23941799c353ceb7a45b38a950ebc5a20" + integrity sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw== + +jasmine-core@~2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e" + integrity sha1-vMl5rh+f0FcB5F5S5l06XWPxok4= + +jasmine-core@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.5.0.tgz#132c23e645af96d85c8bca13c8758b18429fc1e4" + integrity sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA== + +jasmine-spec-reporter@~5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/jasmine-spec-reporter/-/jasmine-spec-reporter-5.0.2.tgz#b61288ab074ad440dc2477c4d42840b0e74a6b95" + integrity sha512-6gP1LbVgJ+d7PKksQBc2H0oDGNRQI3gKUsWlswKaQ2fif9X5gzhQcgM5+kiJGCQVurOG09jqNhk7payggyp5+g== + dependencies: + colors "1.4.0" + +jasmine@2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.8.0.tgz#6b089c0a11576b1f16df11b80146d91d4e8b8a3e" + integrity sha1-awicChFXax8W3xG4AUbZHU6Lij4= + dependencies: + exit "^0.1.2" + glob "^7.0.6" + jasmine-core "~2.8.0" + +jasminewd2@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/jasminewd2/-/jasminewd2-2.2.0.tgz#e37cf0b17f199cce23bea71b2039395246b4ec4e" + integrity sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4= + +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" + +jest-worker@^26.0.0: + version "26.3.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.3.0.tgz#7c8a97e4f4364b4f05ed8bca8ca0c24de091871f" + integrity sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +"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" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + 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.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +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" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json3@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.0, json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + +jsonc-parser@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.3.0.tgz#7c7fc988ee1486d35734faaaa866fadb00fa91ee" + integrity sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" + integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== + dependencies: + universalify "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +jszip@^3.1.3: + version "3.5.0" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.5.0.tgz#b4fd1f368245346658e781fec9675802489e15f6" + integrity sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + set-immediate-shim "~1.0.1" + +just-clone@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/just-clone/-/just-clone-3.1.0.tgz#10efc422e9b041355c43b8076d7b768b7a09fbbd" + integrity sha512-sROn15yHaeNYSTG49HmfbQLtsZvMBb2COvVofNXbeUXx6GkERkdjG3dfejD0fe78gdHJLyS+fOz897H73S8LqA== + +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== + +karma-chrome-launcher@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz#805a586799a4d05f4e54f72a204979f3f3066738" + integrity sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg== + dependencies: + which "^1.2.1" + +karma-coverage-istanbul-reporter@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz#f3b5303553aadc8e681d40d360dfdc19bc7e9fe9" + integrity sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw== + dependencies: + istanbul-lib-coverage "^3.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^3.0.6" + istanbul-reports "^3.0.2" + minimatch "^3.0.4" + +karma-jasmine-html-reporter@^1.5.0: + version "1.5.4" + resolved "https://registry.yarnpkg.com/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.4.tgz#669f33d694d88fce1b0ccfda57111de716cb0192" + integrity sha512-PtilRLno5O6wH3lDihRnz0Ba8oSn0YUJqKjjux1peoYGwo0AQqrWRbdWk/RLzcGlb+onTyXAnHl6M+Hu3UxG/Q== + +karma-jasmine@~3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-3.3.1.tgz#c01b1a2ec973e1531c1f6535e1d7d66b8e4275c2" + integrity sha512-Nxh7eX9mOQMyK0VSsMxdod+bcqrR/ikrmEiWj5M6fwuQ7oI+YEF1FckaDsWfs6TIpULm9f0fTKMjF7XcrvWyqQ== + dependencies: + jasmine-core "^3.5.0" + +karma-source-map-support@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz#58526ceccf7e8730e56effd97a4de8d712ac0d6b" + integrity sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A== + dependencies: + source-map-support "^0.5.5" + +karma@~5.0.0: + version "5.0.9" + resolved "https://registry.yarnpkg.com/karma/-/karma-5.0.9.tgz#11a119b0c763a806fdc471b40c594a2240b5ca13" + integrity sha512-dUA5z7Lo7G4FRSe1ZAXqOINEEWxmCjDBbfRBmU/wYlSMwxUQJP/tEEP90yJt3Uqo03s9rCgVnxtlfq+uDhxSPg== + dependencies: + body-parser "^1.19.0" + braces "^3.0.2" + chokidar "^3.0.0" + colors "^1.4.0" + connect "^3.7.0" + di "^0.0.1" + dom-serialize "^2.2.1" + flatted "^2.0.2" + glob "^7.1.6" + graceful-fs "^4.2.4" + http-proxy "^1.18.1" + isbinaryfile "^4.0.6" + lodash "^4.17.15" + log4js "^6.2.1" + mime "^2.4.5" + minimatch "^3.0.4" + qjobs "^1.2.0" + range-parser "^1.2.1" + rimraf "^3.0.2" + socket.io "^2.3.0" + source-map "^0.6.1" + tmp "0.2.1" + ua-parser-js "0.7.21" + yargs "^15.3.1" + +keyv@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.1.tgz#9fe703cb4a94d6d11729d320af033307efd02ee6" + integrity sha512-xz6Jv6oNkbhrFCvCP7HQa8AaII8y8LRpoSm661NOKLr4uHuBwhX4epXrPQgF3+xdJnN4Esm5X0xwY4bOlALOtw== + dependencies: + json-buffer "3.0.1" + +killable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +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.2" + less "^3.11.1" + loader-utils "^2.0.0" + schema-utils "^2.6.6" + +less@^3.10.3, less@^3.11.1: + version "3.12.2" + resolved "https://registry.yarnpkg.com/less/-/less-3.12.2.tgz#157e6dd32a68869df8859314ad38e70211af3ab4" + integrity sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q== + dependencies: + tslib "^1.10.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + native-request "^1.0.5" + source-map "~0.6.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levenary@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" + integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== + dependencies: + leven "^3.1.0" + +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" + +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +loader-runner@^2.4.0: + version "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" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +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= + +lodash.sortby@^4.7.0: + version "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.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + +log-symbols@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" + integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== + dependencies: + chalk "^2.4.2" + +log4js@^6.2.1: + version "6.3.0" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.3.0.tgz#10dfafbb434351a3e30277a00b9879446f715bcb" + integrity sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw== + dependencies: + date-format "^3.0.0" + debug "^4.1.1" + flatted "^2.0.1" + rfdc "^1.1.4" + streamroller "^2.2.4" + +loglevel@^1.6.8: + version "1.7.0" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.0.tgz#728166855a740d59d38db01cf46f042caa041bb0" + integrity sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ== + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@0.25.7, magic-string@^0.25.0, magic-string@^0.25.7: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0, make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +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" + mississippi "^3.0.0" + node-fetch-npm "^2.0.2" + promise-retry "^1.1.1" + socks-proxy-agent "^4.0.0" + ssri "^6.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" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +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== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-source-map@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== + dependencies: + source-map "^0.6.1" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.44.0, "mime-db@>= 1.43.0 < 2": + version "1.44.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + dependencies: + mime-db "1.44.0" + +mime@1.6.0, mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.3.1, mime@^2.4.4, mime@^2.4.5: + version "2.4.6" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" + integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== + +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== + +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +mini-css-extract-plugin@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e" + integrity sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A== + dependencies: + loader-utils "^1.1.0" + normalize-url "1.9.1" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +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-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== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +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: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + dependencies: + yallist "^4.0.0" + +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 "^2.9.0" + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +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: + 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" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, 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== + dependencies: + minimist "^1.2.5" + +mkdirp@^1.0.3, mkdirp@^1.0.4, mkdirp@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +moment@^2.10.2: + 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" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.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" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@^2.0.0, ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nan@^2.12.1: + version "2.14.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" + integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +native-request@^1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/native-request/-/native-request-1.0.7.tgz#ff742dc555b4c8f2f1c14b548639ba174e573856" + integrity sha512-9nRjinI9bmz+S7dgNtf4A70+/vPhnd+2krGpy4SUlADuOuSa24IDkNaZ+R/QT1wQ6S8jBdi6wE7fLekFZNfUpQ== + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +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.1.0" + resolved "https://registry.yarnpkg.com/ng-packagr/-/ng-packagr-10.1.0.tgz#a2fc0f86f5f8895f811597d33d943f93c7c77c17" + integrity sha512-KXyajkAyY/51iMJPVezDybb5Bn1rtl/JDGC4w9jjIdeL2Ip+KTMDGsqpc+5nQm/vnasZcJ/Xj2a+0VOwrbyVWg== + dependencies: + "@rollup/plugin-commonjs" "^15.0.0" + "@rollup/plugin-json" "^4.0.0" + "@rollup/plugin-node-resolve" "^9.0.0" + ajv "^6.12.3" + autoprefixer "^9.6.5" + browserslist "^4.7.0" + chalk "^4.0.0" + chokidar "^3.2.1" + commander "^6.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.29" + postcss-url "^8.0.0" + read-pkg-up "^5.0.0" + rimraf "^3.0.0" + rollup "^2.8.0" + rollup-plugin-sourcemaps "^0.6.0" + rxjs "^6.5.0" + sass "^1.23.0" + stylus "^0.54.7" + terser "^5.0.0" + +nice-try@^1.0.4: + version "1.0.5" + 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-forge@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" + integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-releases@^1.1.60: + version "1.1.60" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.60.tgz#6948bdfce8286f0b5d0e5a88e8384e954dfe7084" + integrity sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA== + +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" + integrity sha512-Swcmr38Y7uB78itQeBm3mThjxBy9/Ah/ykPIaURY/L6Nec9AyRoL/jJ7ECfMR+oZeCTVQNxVMu/aHU+TLRVbdg== + dependencies: + find-parent-dir "^0.3.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== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +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.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== + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-install-checks@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-4.0.0.tgz#a37facc763a2fde0497ef2c6d0ac7c3fbe00d7b4" + integrity sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w== + dependencies: + semver "^7.1.1" + +npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: + version "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: + 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== + dependencies: + hosted-git-info "^3.0.2" + semver "^7.0.0" + validate-npm-package-name "^3.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== + dependencies: + 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.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-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: + figgy-pudding "^3.5.1" + npm-package-arg "^6.0.0" + semver "^5.4.1" + +npm-registry-fetch@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz#57951bf6541e0246b34c9f9a38ab73607c9449d7" + integrity sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ== + dependencies: + JSONStream "^1.3.4" + bluebird "^3.5.1" + figgy-pudding "^3.4.1" + lru-cache "^5.1.1" + 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" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.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" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-component@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.7.0: + 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" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" + integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "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" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +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== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + 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" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "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.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +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" + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +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" + cli-spinners "^2.2.0" + is-interactive "^1.0.0" + log-symbols "^3.0.0" + mute-stream "0.0.8" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +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@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e" + integrity sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +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== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe" + integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== + dependencies: + retry "^0.12.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +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" + 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" + 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, pako@~1.0.5: + 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-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" + integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + +parseqs@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= + dependencies: + better-assert "~1.0.0" + +parseuri@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= + dependencies: + better-assert "~1.0.0" + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.1, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "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.2.1, 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== + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +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.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" + +posix-character-classes@^0.1.0: + version "0.1.1" + 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.4" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.4.tgz#5e177ddb417341e6d4a193c5d9fd8ada79094f8b" + integrity sha512-0I79VRAd1UTkaHzY9w83P39YGO/M3bG7/tNLrHGEunBolfoGM0hSjrGvjoeaj0JE/zIw5GsI2KZ0UwDJqv5hjw== + 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-import@12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-12.0.1.tgz#cf8c7ab0b5ccab5649024536e565f841928b7153" + integrity sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw== + dependencies: + postcss "^7.0.1" + postcss-value-parser "^3.2.3" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-load-config@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003" + integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q== + dependencies: + cosmiconfig "^5.0.0" + import-cwd "^2.0.0" + +postcss-loader@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== + dependencies: + loader-utils "^1.1.0" + postcss "^7.0.0" + postcss-load-config "^2.0.0" + schema-utils "^1.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-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" + integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.32" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +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.0, 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" + integrity sha512-E2cbOQ5aii2zNHh8F6fk1cxls7QVFZjLPSrqvmiza8OuXLzIpErij8BDS5Y3STPfJgpIMNCPEr8JlKQWEoozUw== + dependencies: + mime "^2.3.1" + minimatch "^3.0.4" + mkdirp "^0.5.0" + postcss "^7.0.2" + xxhashjs "^0.2.1" + +postcss-value-parser@^3.0.0, postcss-value-parser@^3.2.3: + 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, postcss-value-parser@^4.0.3, postcss-value-parser@^4.1.0: + 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@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.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== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +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" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise-retry@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" + integrity sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0= + dependencies: + err-code "^1.0.0" + retry "^0.10.0" + +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" + blocking-proxy "^1.0.0" + browserstack "^1.5.1" + chalk "^1.1.3" + glob "^7.0.3" + jasmine "2.8.0" + jasminewd2 "^2.1.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.1.7" + yargs "^15.3.1" + +proxy-addr@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +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" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + 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@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" + integrity sha1-VXBbzZPF82c1MMLCy8DCs63cKG4= + +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= + +qjobs@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" + integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +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 "^2.0.0" + schema-utils "^2.6.5" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= + dependencies: + pify "^2.3.0" + +read-package-json@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.2.tgz#6992b2b66c7177259feb8eaac73c3acd28b9222a" + integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA== + dependencies: + glob "^7.1.1" + json-parse-even-better-errors "^2.3.0" + normalize-package-data "^2.0.0" + npm-normalize-package-bin "^1.0.0" + +read-package-tree@5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.3.1.tgz#a32cb64c7f31eb8a6f31ef06f9cedf74068fe636" + integrity sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw== + dependencies: + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + util-promisify "^2.1.0" + +read-pkg-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-5.0.0.tgz#b6a6741cb144ed3610554f40162aa07a6db621b8" + integrity sha512-XBQjqOBtTzyol2CpsQOw8LHV0XbDZVG7xMMjmXAJomlVY03WOBRmYgDJETlvcg0H63AJvPRwT7GFi5rvOzUOKg== + dependencies: + find-up "^3.0.0" + read-pkg "^5.0.0" + +read-pkg@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, 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== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +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== + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + graceful-fs "^4.1.2" + once "^1.3.0" + +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== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" + integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== + dependencies: + picomatch "^2.2.1" + +reflect-metadata@^0.1.2: + version "0.1.13" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" + integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== + +regenerator-runtime@0.13.5: + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + +regenerator-runtime@^0.13.4: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + 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" + integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +regexpu-core@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" + integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +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== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +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" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-alpn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.0.0.tgz#745ad60b3d6aff4b4a48e01b8c0bdc70959e0e8c" + integrity sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA== + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +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" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.1.7, resolve@^1.10.0, 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== + dependencies: + path-parse "^1.0.6" + +responselike@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" + integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== + dependencies: + lowercase-keys "^2.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" + integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +reusify@^1.0.4: + version "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" + +rfdc@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.4.tgz#ba72cc1367a0ccd9cf81a870b3b58bd3ad07f8c2" + integrity sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug== + +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, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + 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: + 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" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +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.9" + source-map-resolve "^0.6.0" + +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.8.0: + version "2.26.10" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.26.10.tgz#0ffe0390d35f07af850382f22f1b8525c7f57f07" + integrity sha512-dUnjCWOA0h9qNX6qtcHidyatz8FAFZxVxt1dbcGtKdlJkpSxGK3G9+DLCYvtZr9v94D129ij9zUhG+xbRoqepw== + optionalDependencies: + fsevents "~2.1.2" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rxjs@6.5.5, 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== + dependencies: + tslib "^1.9.0" + +rxjs@^6.5.0, rxjs@^6.5.3: + version "6.6.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.2.tgz#8096a7ac03f2cc4fe5860ef6e572810d9e01c0d2" + integrity sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, 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" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, 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-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sass-loader@8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d" + integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ== + dependencies: + clone-deep "^4.0.1" + loader-utils "^1.2.3" + neo-async "^2.6.1" + schema-utils "^2.6.1" + semver "^6.3.0" + +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" + +sass@^1.23.0: + version "1.26.10" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.26.10.tgz#851d126021cdc93decbf201d1eca2a20ee434760" + integrity sha512-bzN0uvmzfsTvjz0qwccN1sPm2HxxpNI/Xa+7PlUEMS+nQvbyuEK7Y0qFqxlPHhiNHb1Ze8WQJtU31olMObkAMw== + dependencies: + chokidar ">=2.0.0 <4.0.0" + +saucelabs@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-1.5.0.tgz#9405a73c360d449b232839919a86c396d379fd9d" + integrity sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ== + dependencies: + https-proxy-agent "^2.2.1" + +sax@>=0.6.0, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.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.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz#2ba87a1662c020b8988c981ae62cb2a01298eafc" + integrity sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q== + dependencies: + jszip "^3.1.3" + rimraf "^2.5.4" + tmp "0.0.30" + xml2js "^0.4.17" + +selfsigned@^1.10.7: + version "1.10.7" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b" + integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA== + dependencies: + node-forge "0.9.0" + +semver-dsl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/semver-dsl/-/semver-dsl-1.0.1.tgz#d3678de5555e8a61f629eed025366ae5f27340a0" + integrity sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA= + dependencies: + semver "^5.3.0" + +semver-intersect@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/semver-intersect/-/semver-intersect-1.4.0.tgz#bdd9c06bedcdd2fedb8cd352c3c43ee8c61321f3" + integrity sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ== + 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@^5.5.1, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@7.3.2, 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.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" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^3.0.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== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-immediate-shim@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.3" + 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" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +smart-buffer@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" + integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +snq@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/snq/-/snq-1.0.3.tgz#f9661d10eebb224c52fc3c50106445c268618168" + integrity sha512-bXcxd1ppFnSNYKq84HyOYuYtbMHCFTZvuPSNCn/80yx9+DLkU/hLqjqCRKRHSDISrL1T/lWGXJyQxWS8TnutFA== + +socket.io-adapter@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9" + integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== + +socket.io-client@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.3.0.tgz#14d5ba2e00b9bcd145ae443ab96b3f86cbcc1bb4" + integrity sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA== + dependencies: + backo2 "1.0.2" + base64-arraybuffer "0.1.5" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "~4.1.0" + engine.io-client "~3.4.0" + has-binary2 "~1.0.2" + has-cors "1.1.0" + indexof "0.0.1" + object-component "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + socket.io-parser "~3.3.0" + to-array "0.1.4" + +socket.io-parser@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f" + integrity sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng== + dependencies: + component-emitter "1.2.1" + debug "~3.1.0" + isarray "2.0.1" + +socket.io-parser@~3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.4.1.tgz#b06af838302975837eab2dc980037da24054d64a" + integrity sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A== + dependencies: + component-emitter "1.2.1" + debug "~4.1.0" + isarray "2.0.1" + +socket.io@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.3.0.tgz#cd762ed6a4faeca59bc1f3e243c0969311eb73fb" + integrity sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg== + dependencies: + debug "~4.1.0" + engine.io "~3.4.0" + has-binary2 "~1.0.2" + socket.io-adapter "~1.1.0" + socket.io-client "2.3.0" + socket.io-parser "~3.4.0" + +sockjs-client@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" + integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== + dependencies: + debug "^3.2.5" + eventsource "^1.0.7" + faye-websocket "~0.11.1" + inherits "^2.0.3" + json3 "^3.3.2" + url-parse "^1.4.3" + +sockjs@0.3.20: + version "0.3.20" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.20.tgz#b26a283ec562ef8b2687b44033a4eeceac75d855" + integrity sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA== + dependencies: + faye-websocket "^0.10.0" + uuid "^3.4.0" + websocket-driver "0.6.5" + +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 "~4.2.1" + socks "~2.3.2" + +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== + dependencies: + ip "1.1.5" + smart-buffer "^4.1.0" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^2.0.0: + version "2.0.1" + 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@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: + 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" + 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== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + 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.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== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@~0.4.0: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + +source-map-url@^0.4.0: + version "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" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +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" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +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" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +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: + figgy-pudding "^3.5.1" + +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== + dependencies: + minipass "^3.1.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== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +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-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.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== + +streamroller@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-2.2.4.tgz#c198ced42db94086a6193608187ce80a5f2b0e53" + integrity sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ== + dependencies: + date-format "^2.1.0" + debug "^4.1.1" + fs-extra "^8.1.0" + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +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.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.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +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 "^2.0.0" + schema-utils "^2.6.6" + +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-loader@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-3.0.2.tgz#27a706420b05a38e038e7cacb153578d450513c6" + integrity sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA== + dependencies: + loader-utils "^1.0.2" + lodash.clonedeep "^4.5.0" + when "~3.6.x" + +stylus@0.54.7: + version "0.54.7" + resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.7.tgz#c6ce4793965ee538bcebe50f31537bfc04d88cd2" + integrity sha512-Yw3WMTzVwevT6ZTrLCYNHAFmanMxdylelL3hkWNgPMeTCpMwpV3nXjpOHuBXtFv7aiO2xRuQS6OoAdgkNcSNug== + dependencies: + css-parse "~2.0.0" + debug "~3.1.0" + glob "^7.1.3" + mkdirp "~0.5.x" + safer-buffer "^2.1.2" + sax "~1.2.4" + semver "^6.0.0" + source-map "^0.7.3" + +stylus@^0.54.7: + version "0.54.8" + resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.8.tgz#3da3e65966bc567a7b044bfe0eece653e099d147" + integrity sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg== + dependencies: + css-parse "~2.0.0" + debug "~3.1.0" + glob "^7.1.6" + mkdirp "~1.0.4" + safer-buffer "^2.1.2" + sax "~1.2.4" + semver "^6.3.0" + source-map "^0.7.3" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.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" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +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.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" + +tar@^6.0.2: + version "6.0.5" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.5.tgz#bde815086e10b39f1dcd298e89d596e1535e200f" + integrity sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +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.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.0.0" + source-map "^0.6.1" + terser "^4.6.13" + webpack-sources "^1.4.3" + +terser-webpack-plugin@^1.4.3: + version "1.4.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +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" + source-map-support "~0.5.12" + +terser@^4.1.2, 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== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +terser@^5.0.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.0.tgz#c481f4afecdcc182d5e2bdd2ff2dc61555161e81" + integrity sha512-XTT3D3AwxC54KywJijmY2mxZ8nJiEjBHVYzq8l9OaYuRFWeQNBwvipuzzYEP4e+/AVcd1hqG/CqgsdIRyT45Fg== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +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= + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +timers-browserify@^2.0.4: + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + dependencies: + setimmediate "^1.0.4" + +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" + integrity sha1-ckGdSovn1s51FI/YsyTlk6cRwu0= + dependencies: + os-tmpdir "~1.0.1" + +tmp@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +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" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +ts-node@~8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.3.0.tgz#e4059618411371924a1fb5f3b125915f324efb57" + integrity sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ== + dependencies: + arg "^4.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.6" + yn "^3.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.15.4: + version "6.15.4" + resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-6.15.4.tgz#f7fad584e197d0f495f77b5e3ee75a8f4c4dd3da" + integrity sha512-Ifp2yNo4I8q5UwNARUBMnBiFpv5DEtTbCtS8RCjjLOz+PNcThbjUsPJCK3hRnz0dTygM1Fi3Mgvnt/DoKUTU2g== + +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.13.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + +tslib@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e" + integrity sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ== + +tslint@~6.1.0: + version "6.1.3" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" + integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg== + dependencies: + "@babel/code-frame" "^7.0.0" + builtin-modules "^1.1.1" + chalk "^2.3.0" + commander "^2.12.1" + diff "^4.0.1" + glob "^7.1.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + mkdirp "^0.5.3" + resolve "^1.3.2" + semver "^5.3.0" + tslib "^1.13.0" + tsutils "^2.29.0" + +tsutils@^2.29.0: + version "2.29.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" + integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + 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.1.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.1.0.tgz#9bdc22c648cf8cf86dd23d32336a41cfb6475e3f" + integrity sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA== + +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.2, typescript@~3.9.5: + version "3.9.7" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" + integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== + +ua-parser-js@0.7.21: + version "0.7.21" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" + integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ== + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + 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" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +universal-analytics@0.4.20: + version "0.4.20" + resolved "https://registry.yarnpkg.com/universal-analytics/-/universal-analytics-0.4.20.tgz#d6b64e5312bf74f7c368e3024a922135dbf24b03" + integrity sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw== + dependencies: + debug "^3.0.0" + request "^2.88.0" + uuid "^3.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" + integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +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" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" + integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse@^1.4.3: + version "1.4.7" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" + integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util-promisify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/util-promisify/-/util-promisify-2.1.0.tgz#3c2236476c4d32c5ff3c47002add7c13b9a82a53" + integrity sha1-PCI2R2xNMsX/PEcAKt18E7moKlM= + dependencies: + object.getownpropertydescriptors "^2.0.3" + +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" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +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, uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate-npm-package-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= + dependencies: + builtins "^1.0.3" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +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" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= + +watchpack-chokidar2@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" + integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.6.1: + version "1.7.4" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.4.tgz#6e9da53b3c80bb2d6508188f5b200410866cd30b" + integrity sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg== + dependencies: + graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.0" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +webdriver-js-extender@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz#57d7a93c00db4cc8d556e4d3db4b5db0a80c3bb7" + integrity sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ== + dependencies: + "@types/selenium-webdriver" "^3.0.0" + selenium-webdriver "^3.0.1" + +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== + dependencies: + adm-zip "^0.4.9" + chalk "^1.1.1" + del "^2.2.0" + glob "^7.0.3" + ini "^1.3.4" + minimist "^1.2.0" + q "^1.4.1" + request "^2.87.0" + rimraf "^2.5.2" + semver "^5.3.0" + xml2js "^0.4.17" + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +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" + integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-server@3.11.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz#8f154a3bce1bcfd1cc618ef4e703278855e7ff8c" + integrity sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.1.8" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + debug "^4.1.1" + del "^4.1.1" + express "^4.17.1" + html-entities "^1.3.1" + http-proxy-middleware "0.19.1" + import-local "^2.0.0" + internal-ip "^4.3.0" + ip "^1.1.5" + is-absolute-url "^3.0.3" + killable "^1.0.1" + loglevel "^1.6.8" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.26" + schema-utils "^1.0.0" + selfsigned "^1.10.7" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "0.3.20" + sockjs-client "1.4.0" + spdy "^4.0.2" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "^13.3.2" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-merge@4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" + integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== + dependencies: + lodash "^4.17.15" + +webpack-sources@1.4.3, webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +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.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.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" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + 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.1" + webpack-sources "^1.4.1" + +websocket-driver@0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + integrity sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY= + dependencies: + websocket-extensions ">=0.1.1" + +websocket-driver@>=0.5.1: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^8.0.0: + version "8.2.1" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.2.1.tgz#ed73417230784b281fb2a32c3c501738b46167c3" + integrity sha512-ZmVCr6nfBeaMxEHALLEGy0LszYjpJqf6PVNQUQ1qd9Et+q7Jpygd4rGGDXgHjD8e99yLFseD69msHDM4YwPZ4A== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^2.0.2" + webidl-conversions "^6.1.0" + +when@~3.6.x: + version "3.6.4" + resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e" + integrity sha1-RztRfsFZ4rhQBUl6E5g/CVQS404= + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.1, which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +worker-plugin@4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/worker-plugin/-/worker-plugin-4.0.3.tgz#7c42e600d5931ad154d3d5f187a32446df64db0f" + integrity sha512-7hFDYWiKcE3yHZvemsoM9lZis/PzurHAEX1ej8PLCu818Rt6QqUAiDdxHPCKZctzmhqzPpcFSgvMCiPbtooqAg== + dependencies: + loader-utils "^1.1.0" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +ws@^7.1.2: + version "7.3.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" + integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== + +ws@~6.1.0: + version "6.1.4" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9" + integrity sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA== + dependencies: + async-limiter "~1.0.0" + +xml2js@^0.4.17: + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xmlhttprequest-ssl@~1.5.4: + version "1.5.5" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" + integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= + +xtend@^4.0.0, 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" + integrity sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw== + dependencies: + cuint "^0.2.2" + +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== + +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@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^18.1.0, yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@15.3.0: + version "15.3.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.0.tgz#403af6edc75b3ae04bf66c94202228ba119f0976" + integrity sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.0" + +yargs@^13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +yargs@^15.3.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= + +yn@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +zone.js@~0.10.2: + version "0.10.3" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.10.3.tgz#3e5e4da03c607c9dcd92e37dd35687a14a140c16" + integrity sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg== From c2191fee2e0696274b34f6c5a509e7c0f2b1a311 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 03:16:49 +0300 Subject: [PATCH 050/116] chore: uncomment a step --- .github/workflows/angular.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/angular.yml b/.github/workflows/angular.yml index 8df639431f..a011f40195 100644 --- a/.github/workflows/angular.yml +++ b/.github/workflows/angular.yml @@ -43,6 +43,6 @@ jobs: run: yarn install working-directory: templates/app/angular - # - name: Build app template - # run: yarn build --prod - # working-directory: templates/app/angular + - name: Build app template + run: yarn build --prod + working-directory: templates/app/angular From cee44528639598d5b4f73c5695dd93850258b1c1 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 03:30:10 +0300 Subject: [PATCH 052/116] ci: update target cache folder paths --- .github/workflows/angular.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/angular.yml b/.github/workflows/angular.yml index a011f40195..c5450b339e 100644 --- a/.github/workflows/angular.yml +++ b/.github/workflows/angular.yml @@ -12,7 +12,9 @@ jobs: - uses: actions/cache@v2 with: - path: '*/*/node_modules' + path: | + npm/ng-packs/node_modules + templates/app/angular/node_modules key: ${{ runner.os }}-${{ hashFiles('**/yarn.lock') }} - uses: actions/setup-node@v1 @@ -43,6 +45,6 @@ jobs: run: yarn install working-directory: templates/app/angular - - name: Build app template - run: yarn build --prod - working-directory: templates/app/angular + # - name: Build app template + # run: yarn build --prod + # working-directory: templates/app/angular From c47e70a36154836594b2fa7bb308b916eeb5e7a1 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 03:38:14 +0300 Subject: [PATCH 054/116] chore: update angular.yml --- .github/workflows/angular.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/angular.yml b/.github/workflows/angular.yml index c5450b339e..0d0d81e455 100644 --- a/.github/workflows/angular.yml +++ b/.github/workflows/angular.yml @@ -42,7 +42,7 @@ jobs: # working-directory: npm/ng-packs - name: Install packages of app template - run: yarn install + run: yarn install && yarn ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points working-directory: templates/app/angular # - name: Build app template From e1fd221610c5b9cb40a305171ecd1b4453b8d76c Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 03:40:55 +0300 Subject: [PATCH 055/116] chore: trigger ci --- .github/workflows/angular.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/angular.yml b/.github/workflows/angular.yml index 0d0d81e455..4392a37993 100644 --- a/.github/workflows/angular.yml +++ b/.github/workflows/angular.yml @@ -17,9 +17,9 @@ jobs: templates/app/angular/node_modules key: ${{ runner.os }}-${{ hashFiles('**/yarn.lock') }} - - uses: actions/setup-node@v1 - with: - node-version: '12.x' + # - uses: actions/setup-node@v1 + # with: + # node-version: '12.x' - name: Install packages run: yarn install From a16dfaa1069f58cb65546275a49025a78aebe0a0 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 03:43:16 +0300 Subject: [PATCH 056/116] chore: reset cache --- .github/workflows/angular.yml | 8 ++++---- templates/app/angular/yarn.lock | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/angular.yml b/.github/workflows/angular.yml index 4392a37993..d187cf301a 100644 --- a/.github/workflows/angular.yml +++ b/.github/workflows/angular.yml @@ -42,9 +42,9 @@ jobs: # working-directory: npm/ng-packs - name: Install packages of app template - run: yarn install && yarn ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points + run: yarn install working-directory: templates/app/angular - # - name: Build app template - # run: yarn build --prod - # working-directory: templates/app/angular + - name: Build app template + run: yarn build --prod + working-directory: templates/app/angular diff --git a/templates/app/angular/yarn.lock b/templates/app/angular/yarn.lock index fdc7fcb450..1a778347bd 100644 --- a/templates/app/angular/yarn.lock +++ b/templates/app/angular/yarn.lock @@ -9717,4 +9717,4 @@ yn@^3.0.0: zone.js@~0.10.2: version "0.10.3" resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.10.3.tgz#3e5e4da03c607c9dcd92e37dd35687a14a140c16" - integrity sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg== + integrity sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg== \ No newline at end of file From e7a199d9d7e83e1cd8d4a1ee97630891dd5c1e1b Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Sat, 5 Sep 2020 03:57:26 +0300 Subject: [PATCH 058/116] chore: uncomment ci steps --- .github/workflows/angular.yml | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/.github/workflows/angular.yml b/.github/workflows/angular.yml index d187cf301a..3a6d486144 100644 --- a/.github/workflows/angular.yml +++ b/.github/workflows/angular.yml @@ -17,29 +17,25 @@ jobs: templates/app/angular/node_modules key: ${{ runner.os }}-${{ hashFiles('**/yarn.lock') }} - # - uses: actions/setup-node@v1 - # with: - # node-version: '12.x' - - name: Install packages run: yarn install working-directory: npm/ng-packs - # - name: Run lint - # run: yarn ng lint - # working-directory: npm/ng-packs + - name: Run lint + run: yarn ng lint + working-directory: npm/ng-packs - # - name: Run prepare workspace - # run: yarn prepare:workspace - # working-directory: npm/ng-packs + - name: Run prepare workspace + run: yarn prepare:workspace + working-directory: npm/ng-packs - # - name: Run test - # run: yarn ci:test - # working-directory: npm/ng-packs + - name: Run test + run: yarn ci:test + working-directory: npm/ng-packs - # - name: Build dev-app - # run: yarn build --prod - # working-directory: npm/ng-packs + - name: Build dev-app + run: yarn build --prod + working-directory: npm/ng-packs - name: Install packages of app template run: yarn install From 38b1943b6055a1614b21b724a7e4018bc068c97f Mon Sep 17 00:00:00 2001 From: maliming <6908465+maliming@users.noreply.github.com> Date: Sat, 5 Sep 2020 22:11:24 +0800 Subject: [PATCH 059/116] Add CS0436 to common.props. Resolve #4778 --- common.props | 2 +- common.test.props | 2 +- modules/cms-kit/common.props | 2 +- modules/identityserver/common.props | 2 +- templates/app/aspnet-core/common.props | 2 +- templates/console/common.props | 2 +- templates/module/aspnet-core/common.props | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/common.props b/common.props index 890cdff1e6..c9f4a9656a 100644 --- a/common.props +++ b/common.props @@ -2,7 +2,7 @@ latest 3.2.0 - $(NoWarn);CS1591 + $(NoWarn);CS1591;CS0436 https://abp.io/assets/abp_nupkg.png https://abp.io/ LICENSE.md diff --git a/common.test.props b/common.test.props index e90103e606..233afe8282 100644 --- a/common.test.props +++ b/common.test.props @@ -1,7 +1,7 @@ latest - $(NoWarn);CS1591 + $(NoWarn);CS1591;CS0436 true false false diff --git a/modules/cms-kit/common.props b/modules/cms-kit/common.props index 0e2bf35066..420d9c492c 100644 --- a/modules/cms-kit/common.props +++ b/modules/cms-kit/common.props @@ -2,7 +2,7 @@ latest 0.1.0 - $(NoWarn);CS1591 + $(NoWarn);CS1591;CS0436 module diff --git a/modules/identityserver/common.props b/modules/identityserver/common.props index a9aaa3c07a..7f5a705307 100644 --- a/modules/identityserver/common.props +++ b/modules/identityserver/common.props @@ -2,7 +2,7 @@ latest 0.3.0 - $(NoWarn);CS1591 + $(NoWarn);CS1591;CS0436 http://www.aspnetboilerplate.com/images/abp_nupkg.png http://abp.io git diff --git a/templates/app/aspnet-core/common.props b/templates/app/aspnet-core/common.props index 6caad60263..fbef88367b 100644 --- a/templates/app/aspnet-core/common.props +++ b/templates/app/aspnet-core/common.props @@ -2,7 +2,7 @@ latest 1.0.0 - $(NoWarn);CS1591 + $(NoWarn);CS1591;CS0436 app \ No newline at end of file diff --git a/templates/console/common.props b/templates/console/common.props index 4adb69f0fe..233f41c1ba 100644 --- a/templates/console/common.props +++ b/templates/console/common.props @@ -2,7 +2,7 @@ latest 0.1.0 - $(NoWarn);CS1591 + $(NoWarn);CS1591;CS0436 diff --git a/templates/module/aspnet-core/common.props b/templates/module/aspnet-core/common.props index 0e2bf35066..420d9c492c 100644 --- a/templates/module/aspnet-core/common.props +++ b/templates/module/aspnet-core/common.props @@ -2,7 +2,7 @@ latest 0.1.0 - $(NoWarn);CS1591 + $(NoWarn);CS1591;CS0436 module From 60453f12f56a3441a0433e7ea9c45aff7dc65fee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 6 Sep 2020 14:41:49 +0300 Subject: [PATCH 060/116] Update the Angular-Service-Proxies post for the 3.1 final release. --- .../POST.md | 92 ++++++++++++------- 1 file changed, 59 insertions(+), 33 deletions(-) diff --git a/docs/en/Blog-Posts/2020-09-07 Angular-Service-Proxies/POST.md b/docs/en/Blog-Posts/2020-09-07 Angular-Service-Proxies/POST.md index d16540872f..09df3a2119 100644 --- a/docs/en/Blog-Posts/2020-09-07 Angular-Service-Proxies/POST.md +++ b/docs/en/Blog-Posts/2020-09-07 Angular-Service-Proxies/POST.md @@ -1,8 +1,8 @@ # Introducing the Angular Service Proxy Generation -Angular Service Proxy System **generates TypeScript services and models** to consume your backend HTTP APIs developed using the ABP Framework. So, you **don't manually create** models for your server side DTOs and perform raw HTTP calls to the server. +ABP Angular Service Proxy System **generates TypeScript services and models** to consume your backend HTTP APIs developed using the ABP Framework. So, you **don't manually create** models for your server side DTOs and perform raw HTTP calls to the server. -ABP Framework has introduced the **new** Angular Service Proxy Generation system with the version 3.1. While this feature was available since the [v2.3](https://blog.abp.io/abp/ABP-Framework-v2_3_0-Has-Been-Released), it was not well covering some scenarios, like inheritance and generic types and had some known problems. **With the v3.1, we've re-written** it using the [Angular Schematics](https://angular.io/guide/schematics) system. Now, it is much more stable and feature rich. +ABP Framework has introduced the **new** Angular Service Proxy Generation system with the **version 3.1**. While this feature was available since the [v2.3](https://blog.abp.io/abp/ABP-Framework-v2_3_0-Has-Been-Released), it was not well covering some scenarios, like inheritance and generic types and had some known problems. **With the v3.1, we've re-written** it using the [Angular Schematics](https://angular.io/guide/schematics) system. Now, it is much more stable and feature rich. This post introduces the service proxy generation system and highlights some important features. @@ -47,6 +47,15 @@ apis: { `Acme.BookStore` should be replaced by the root namespace of your .NET project. This ensures to not create unnecessary nested folders while creating the service proxy code. This value is `AngularProxyDemo` for the example solution explained below. +* Finally, add the following paths to the `tsconfig.base.json` to have a shortcut while importing proxies: + +```json +"paths": { + "@proxy": ["src/app/proxy/index.ts"], + "@proxy/*": ["src/app/proxy/*"] +} +``` + ## Basic Usage ### Project Creation @@ -139,21 +148,23 @@ abp generate-proxy It should produce an output like the following: ````bash -CREATE src/app/shared/models/books/index.ts (142 bytes) -CREATE src/app/shared/services/books/book.service.ts (437 bytes) ... +CREATE src/app/proxy/books/book.service.ts (446 bytes) +CREATE src/app/proxy/books/models.ts (148 bytes) +CREATE src/app/proxy/books/index.ts (57 bytes) +CREATE src/app/proxy/index.ts (33 bytes) ```` > `generate-proxy` command can take some some optional parameters for advanced scenarios (like [modular development](https://docs.abp.io/en/abp/latest/Module-Development-Basics)). You can take a look at the [documentation](https://docs.abp.io/en/abp/latest/UI/Angular/Service-Proxies). -It basically creates two files; +#### The Generated Code -src/app/shared/services/books/**book.service.ts**: This is the service that can be injected and used to get the list of books; +`src/app/proxy/books/book.service.ts`: This is the service that can be injected and used to get the list of books; -````typescript +````js +import type { BookDto } from './models'; import { RestService } from '@abp/ng.core'; import { Injectable } from '@angular/core'; -import type { BookDto } from '../../models/book'; @Injectable({ providedIn: 'root', @@ -170,12 +181,11 @@ export class BookService { constructor(private restService: RestService) {} } - ```` -src/app/shared/models/books/**index.ts**: This file contains the modal classes corresponding to the DTOs defined in the server side; +`src/app/proxy/books/models.ts`: This file contains the modal classes corresponding to the DTOs defined in the server side; -````typescript +````js import type { EntityDto } from '@abp/ng.core'; export interface BookDto extends EntityDto { @@ -184,7 +194,21 @@ export interface BookDto extends EntityDto { } ```` -You can now inject the `BookService` into any Angular component and use the `getList()` method to get the list of books. +> There are a few more files have been generated to help you import the types easier. + +#### How to Import + +You can now import the `BookService` into any Angular component and use the `getList()` method to get the list of books. + +````js +import { BookService, BookDto } from '../proxy/books'; +```` + +You can also use the `@proxy` as a shortcut of the proxy folder: + +````js +import { BookService, BookDto } from '@proxy/books'; +```` ### About the Generated Code @@ -235,27 +259,20 @@ namespace AngularProxyDemo.Books } ``` -Let's re-run the `generate-proxy` command to see the result: - -```` -abp generate-proxy -```` - -The output of this command will be like the following: +Let's re-run the `generate-proxy` command: ````bash -UPDATE src/app/shared/services/books/book.service.ts (660 bytes) -UPDATE src/app/shared/models/books/index.ts (217 bytes) +abp generate-proxy ```` -It tells us two files have been updated. Let's see the changes; +This command will re-generate the proxies by updating some files. Let's see some of the changes; **book.service.ts** -````typescript +````js +import type { BookDto, BookUpdateDto } from './models'; import { RestService } from '@abp/ng.core'; import { Injectable } from '@angular/core'; -import type { BookDto, BookUpdateDto } from '../../models/books'; @Injectable({ providedIn: 'root', @@ -284,7 +301,7 @@ export class BookService { `update` function has been added to the `BookService` that gets an `id` and a `BookUpdateDto` as the parameters. -**index.ts** +**models.ts** ````typescript import type { EntityDto } from '@abp/ng.core'; @@ -358,14 +375,14 @@ namespace AngularProxyDemo.Orders } ```` -When I run the `abp generate-proxy` command again, I see two new files have been created. +When I run the `abp generate-proxy` command again, I see there are some created and updated files. Let's see some important ones; -src/app/shared/services/orders/**order.service.ts** +`src/app/proxy/orders/order.service.ts` -````typescript +````js +import type { OrderCreateDto } from './models'; import { RestService } from '@abp/ng.core'; import { Injectable } from '@angular/core'; -import type { OrderCreateDto } from '../../models/orders'; @Injectable({ providedIn: 'root', @@ -385,16 +402,19 @@ export class OrderService { } ```` -src/app/shared/models/orders/**index.ts** +`src/app/proxy/orders/models.ts` ````typescript -import type { GenericDetailDto } from '../../models/orders'; +export interface GenericDetailDto { + productId: string; + count: TCount; +} export interface OrderCreateDto { customerId: string; creationTime: string; details: OrderDetailDto[]; - extraProperties: string | object; + extraProperties: Record; } export interface OrderDetailDto extends GenericDetailDto { @@ -402,4 +422,10 @@ export interface OrderDetailDto extends GenericDetailDto { } ```` -NOTE: 3.1.0-rc2 was generating the code above, which is wrong. It will be fixed in the next RC versions. \ No newline at end of file +## Conclusion + +`abp generate-proxy` is a very handy command that creates all the necessary code to consume your ABP based backend HTTP APIs. It generates a clean code that is well aligned to the backend services and benefits from the power of TypeScript (by using generics, inheritance...). + +## The Documentation + +See [the documentation](https://docs.abp.io/en/abp/latest/UI/Angular/Service-Proxies) for details of the Angular Service Proxy Generation. \ No newline at end of file From 57a90ad5eb25793f0be12ca169ef35ae41ee3eec Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Sun, 6 Sep 2020 23:01:00 +0800 Subject: [PATCH 061/116] Update Chinese documents. --- .../Authentication/Social-External-Logins.md | 9 +- docs/zh-Hans/CLI.md | 189 +++++++++++++----- docs/zh-Hans/Contribution/Index.md | 28 +-- ...-Application-Modules-Extending-Entities.md | 5 +- docs/zh-Hans/Entities.md | 6 + .../Entity-Framework-Core-Migrations.md | 5 +- docs/zh-Hans/Entity-Framework-Core.md | 5 +- .../Getting-Started-Console-Application.md | 3 - docs/zh-Hans/Global-Features.md | 3 + docs/zh-Hans/How-To/Index.md | 9 - docs/zh-Hans/Local-Event-Bus.md | 2 + docs/zh-Hans/MailKit.md | 1 + docs/zh-Hans/Module-Development-Basics.md | 2 +- docs/zh-Hans/Moodule-Entity-Extensions.md | 3 + docs/zh-Hans/Nightly-Builds.md | 32 +-- docs/zh-Hans/Previews.md | 1 + docs/zh-Hans/Repositories.md | 6 +- docs/zh-Hans/Samples/Index.md | 27 ++- docs/zh-Hans/Startup-Templates/Application.md | 14 ++ docs/zh-Hans/UI/Angular/Environment.md | 1 + docs/zh-Hans/UI/Angular/Migration-Guide-v3.md | 2 +- docs/zh-Hans/UI/Angular/Multi-Tenancy.md | 1 + .../UI/Angular/Permission-Management.md | 4 +- docs/zh-Hans/UI/Angular/Toaster-Service.md | 8 +- .../Customization-User-Interface.md | 2 +- docs/zh-Hans/Upgrading.md | 1 + docs/zh-Hans/Virtual-File-System.md | 105 ++++++---- docs/zh-Hans/docs-nav.json | 52 +++-- docs/zh-Hans/images/replace-email-layout.png | Bin 0 -> 31878 bytes .../zh-Hans/images/solution-files-non-mvc.png | Bin 5658 -> 3043 bytes 30 files changed, 332 insertions(+), 194 deletions(-) delete mode 100644 docs/zh-Hans/Getting-Started-Console-Application.md create mode 100644 docs/zh-Hans/Global-Features.md delete mode 100644 docs/zh-Hans/How-To/Index.md create mode 100644 docs/zh-Hans/MailKit.md create mode 100644 docs/zh-Hans/Moodule-Entity-Extensions.md create mode 100644 docs/zh-Hans/Previews.md create mode 100644 docs/zh-Hans/UI/Angular/Environment.md create mode 100644 docs/zh-Hans/UI/Angular/Multi-Tenancy.md create mode 100644 docs/zh-Hans/Upgrading.md create mode 100644 docs/zh-Hans/images/replace-email-layout.png diff --git a/docs/zh-Hans/Authentication/Social-External-Logins.md b/docs/zh-Hans/Authentication/Social-External-Logins.md index 3d599a962d..55ab97374c 100644 --- a/docs/zh-Hans/Authentication/Social-External-Logins.md +++ b/docs/zh-Hans/Authentication/Social-External-Logins.md @@ -1,10 +1,9 @@ # 社交/外部登录 -## ASP.NET Core MVC / Razor Pages UI [帐户模块](../Modules/Account.md)已配置为开箱即用的处理社交或外部登录. 你可以按照ASP.NET Core文档向你的应用程序添加社交/外部登录提供程序. -### 示例: Facebook 认证 +## 示例: Facebook 认证 按照[ASP.NET Core Facebook集成文档](https://docs.microsoft.com/zh-cn/aspnet/core/security/authentication/social/facebook-logins)向你应用程序添加Facebook登录. @@ -27,4 +26,8 @@ context.Services.AddAuthentication() }); ```` -> 最佳实践是使用 `appsettings.json` 或ASP.NET Core用户机密系统来存储你的凭据,而不是像这样硬编码值. 请参阅[微软](https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/facebook-logins)文档了解如何使用用户机密. \ No newline at end of file +> 最佳实践是使用 `appsettings.json` 或ASP.NET Core用户机密系统来存储你的凭据,而不是像这样硬编码值. 请参阅[微软](https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/facebook-logins)文档了解如何使用用户机密. + +## Angular UI + +从v3.1开始,Angular UI使用授权码流程(作为最佳实践)通过重定向到MVC UI登录页面来对用户进行身份验证. 因此,即使你使用的是Angular UI,社交/外部登录集成也与上面说明的相同.并且可以开箱即用. \ No newline at end of file diff --git a/docs/zh-Hans/CLI.md b/docs/zh-Hans/CLI.md index 82a72ec7ed..20afc1b50f 100644 --- a/docs/zh-Hans/CLI.md +++ b/docs/zh-Hans/CLI.md @@ -16,6 +16,12 @@ dotnet tool install -g Volo.Abp.Cli dotnet tool update -g Volo.Abp.Cli ```` +## 全局选项 + +虽然每个命令可能都有一组选项,但有些全局选项可以与任何命令一起使用: + +* `--skip-cli-version-check`: 跳过检查最新版本的ABP CLI. 如果没有指定,它会检查最新版本,如果检查到ABP CLI的新版本,会显示一条警告消息. + ## Commands 这里是所有可用的命令列表: @@ -25,7 +31,9 @@ dotnet tool update -g Volo.Abp.Cli * **`update`**:自动更新的ABP解决方案ABP相关的NuGet和NPM包. * **`add-package`**: 添加ABP包到项目. * **`add-module`**: 添加[应用模块](https://docs.abp.io/en/abp/latest/Modules/Index)到解决方案. -* **`generate-proxy`**: 生成客户端代理以使用服务器上的HTTP API端点. +* **`generate-proxy`**: 生成客户端代理以使用HTTP API端点. +* **`remove-proxy`**: 移除以前生成的客户端代理. +* **`switch-to-preview`**: 切换到ABP框架的最新预览版本。 * **`switch-to-preview`**: 切换解决方案所有ABP相关包为[夜间构建](Nightly-Builds.md)版本. * **`switch-to-stable`**: 切换解决方案所有ABP相关包为最新的稳定版本. * **`translate`**: 当源代码控制存储库中有多个JSON[本地化](Localization.md文件时,可简化翻译本地化文件的过程. @@ -90,12 +98,33 @@ abp new Acme.BookStore * **`console`**: [Console template](Startup-Templates/Console.md). * `--output-folder` 或者 `-o`: 指定输出文件夹,默认是当前目录. * `--version` 或者 `-v`: 指定ABP和模板的版本.它可以是 [release tag](https://github.com/abpframework/abp/releases) 或者 [branch name](https://github.com/abpframework/abp/branches). 如果没有指定,则使用最新版本.大多数情况下,你会希望使用最新的版本. -* `--preview`: 使用最新的预发行版本 (仅在未指定 `--version` 且最新稳定版本之后至少有一个预发行版时). +* `--preview`: 使用最新的预览版本. * `--template-source` 或者 `-ts`: 指定自定义模板源用于生成项目,可以使用本地源和网络源(例如 `D:\local-templat` 或 `https://.../my-template-file.zip`). * `--create-solution-folder` 或者 `-csf`: 指定项目是在输出文件夹中的新文件夹中还是直接在输出文件夹中. * `--connection-string` 或者 `-cs`: 重写所有 `appsettings.json` 文件的默认连接字符串. 默认连接字符串是 `Server=localhost;Database=MyProjectName;Trusted_Connection=True;MultipleActiveResultSets=true`. 默认的数据库提供程序是 `SQL Server`. 如果你使用EF Core但需要更改DBMS,可以按[这里所述](Entity-Framework-Core-Other-DBMS.md)进行更改(创建解决方案之后). * `--local-framework-ref --abp-path`: 使用对项目的本地引用,而不是替换为NuGet包引用. +### update + +更新所有ABP相关的包可能会很繁琐,框架和模块都有很多包. 此命令自动将解决方案或项目中所有ABP相关的包更新到最新版本. + +用法: + +````bash +abp update [options] +```` + +* 如果你的文件夹中有.sln文件,运行命令会将解决方案中所有项目ABP相关的包更新到最新版本. +* 如果你的文件夹中有.csproj文件,运行命令会将项目中所有ABP相关的包更新到最新版本. + +#### Options + +* `--npm`: 仅更新NPM包 +* `--nuget`: 仅更新的NuGet包 +* `--solution-path` 或 `-sp`: 指定解决方案路径/目录. 默认使用当前目录 +* `--solution-name` 或 `-sn`: 指定解决方案名称. 默认在目录中搜索`*.sln`文件. +*`--check-all`: 分别检查每个包的新版本. 默认是 `false`. + ### add-package 通过以下方式将ABP包添加到项目中 @@ -150,105 +179,157 @@ abp add-module Volo.Blogging * `-sp` 或 `--startup-project`: 启动项目的项目文件夹的相对路径. 默认值是当前文件夹. * `--with-source-code`: 添加模块的源代码,而不是NuGet/NPM软件包. -### update +### generate-proxy -更新所有ABP相关的包可能会很繁琐,框架和模块都有很多包. 此命令自动将解决方案或项目中所有ABP相关的包更新到最新版本. +为您的HTTP API生成Angular服务代理,简化从客户端使用服务的成本. 在运行此命令之前,你的host必须启动正在运行. 用法: ````bash -abp update [options] +abp generate-proxy ```` -* 如果你的文件夹中有.sln文件,运行命令会将解决方案中所有项目ABP相关的包更新到最新版本. -* 如果你的文件夹中有.csproj文件,运行命令会将项目中所有ABP相关的包更新到最新版本. - #### Options -* `--include-previews` 或 `-p`: 将预览版, 测试版本 和 rc 包 同时更新到最新版本. -* `--npm`: 仅更新NPM包 -* `--nuget`: 仅更新的NuGet包 -* `--solution-path` 或 `-sp`: 指定解决方案路径/目录. 默认使用当前目录 -* `--solution-name` 或 `-sn`: 指定解决方案名称. 默认在目录中搜索`*.sln`文件. -*`--check-all`: 分别检查每个包的新版本. 默认是 `false`. - -### 切换到每晚构建(预览)包 +* `--module` 或 `-m`: 指定要为其生成代理的后端模块的名称. 默认值: `app`. +* `--api-name` 或 `-a`: 在 `/src/environments/environment.ts` 中定义的API端点名称。. 默认值: `default`. +* `--source` 或 `-s`: 指定解析根名称空间和API定义URL的Angular项目名称. 默认值: `defaultProject` +* `--target` 或 `-t`: 指定放置生成的代码的Angular项目名称. 默认值: `defaultProject`. +* `--prompt` 或 `-p`: 在命令行提示符下询问选项(未指定的选项). -想要切换到ABP框架的最新**每晚构建**预览版可以使用此命令. +> 参阅 [Angular服务代理文档](UI/Angular/Service-Proxies.md) 了解更多. -用法: +### remove-proxy -````bash -abp switch-to-nightly [options] -```` +从Angular应用程序中删除以前生成的代理代码. 在运行此命令之前,你的host必须启动正在运行. -你也可以使用切换回最新稳定版本: +This can be especially useful when you generate proxies for multiple modules before and need to remove one of them later. + +Usage: ````bash -abp switch-to-stable [options] +abp remove-proxy ```` #### Options -`--solution-directory` 或 `-sd`: 指定解决方案文件夹. 解决方案应该在指定文件夹或子文件夹中. 如果未指定,默认为当前目录. +* `--module` 或 `-m`: 指定要为其生成代理的后端模块的名称. 默认值: `app`. +* `--api-name` 或 `-a`: 在 `/src/environments/environment.ts` 中定义的API端点名称。. 默认值: `default`. +* `--source` 或 `-s`: 指定解析根名称空间和API定义URL的Angular项目名称. 默认值: `defaultProject` +* `--target` 或 `-t`: 指定放置生成的代码的Angular项目名称. 默认值: `defaultProject`. +* `--prompt` 或 `-p`: 在命令行提示符下询问选项(未指定的选项). -### login +> 参阅 [Angular服务代理文档](UI/Angular/Service-Proxies.md) 了解更多. -CLI的一些功能需要登录到abp.io平台. 使用你的用户名登录 +### switch-to-preview -```bash -abp login -``` +你可以使用此命令将项目切换到ABP框架的最新预览版本. -```bash -abp login -p -``` - -请注意,新的登录将终止先前的会话并创建一个新的会话. - -### logout +用法: -通过从计算机中删除会话令牌来注销. +````bash +abp switch-to-preview [options] +```` -``` -abp logout -``` +#### Options -### generate-proxy +* `--solution-directory` 或 `-sd`: 指定目录. 解决方案应该在该目录或其子目录中. 如果未指定默认为当前目录. + +### switch-to-nightly -为你的HTTP API生成客户端代码,简化客户端使用服务的成本. 在运行 `generate-proxy` 命令之前,你的host必须启动正在运行. +想要切换到ABP框架的最新[每晚构建](Nightly-Builds.md)预览版可以使用此命令. 用法: ````bash -abp generate-proxy [options] +abp switch-to-nightly [options] ```` #### Options -* `--apiUrl` 或者 `-a`:指定HTTP API的根URL. 如果未指定这个选项,默认使用你Angular应用程序的`environment.ts`文件API URL. 在运行 `generate-proxy` 命令之前,你的host必须启动正在运行. -* `--ui` 或者 `-u`: 指定UI框架,默认框架是angular.当前只有angular一个选项, 但我们会通过更改CLI增加新的选项. 尽请关注! -* `--module` 或者 `-m`:指定模块名. 默认模块名称为app. 如果你想所有模块,你可以指定 `--module all` 命令. +`--solution-directory` 或 `-sd`: 指定目录. 解决方案应该在该目录或其子目录中. 如果未指定默认为当前目录. -示例: +### switch-to-stable + +如果你使用的是ABP框架预览包(包括每晚构建),可以使用此命令切换回最新的稳定版本. + +用法: ````bash -abp generate-proxy --apiUrl https://localhost:44305 --ui angular --module all +abp switch-to-stable [options] ```` +#### Options -### help +`--solution-directory` 或 `-sd`: 指定目录. 解决方案应该在该目录或其子目录中. 如果未指定默认为当前目录. -CLI的基本用法信息. +### translate -用法: + +源代码控制存储库中有多个JSON[本地化](Localization.md)文件时,用于简化翻译[本地化](Localization.md)文件的过程. + +* 该命令将基于参考文化创建一个统一的json文件 +* 它搜索当前目录和所有子目录中的所有本地化"JSON"文件(递归). 然后创建一个包含所有需要翻译的条目的文件(默认情况下名为 "abp-translation.json"). +* 翻译了此文件中的条目后,你就可以使用 `--apply` 命令将更改应用于原始本地化文件. + +> 该命令的主要目的是翻译ABP框架本地化文件(因为[abp仓库](https://github.com/abpframework/abp)包括数十个要在不同目录中转换的本地化文件). + +#### 创建翻译文件 + +第一步是创建统一的翻译文件: ````bash -abp help [命令名] +abp translate -c [options] ```` 示例: ````bash -abp help # 显示常规帮助. -abp help new # 显示有关 "New" 命令的帮助. +abp translate -c de-DE ```` + +该命令为 `de-DE` (德语)文化创建了统一的翻译文件. + +##### 附加选项 + +* `--reference-culture` 或 `-r`: 默认值 `en`. 指定参考文化. +* `--output` 或 `-o`: 输出文件名. 默认值 `abp-translation.json`. +* `--all-values` 或 `-all`: 包括所有要翻译的键. 默认情况下,统一翻译文件仅包含目标文化的缺失文本. 如果你可能需要修改之前已经翻译的值,请指定此参数. + +#### 应用更改 + + +翻译完统一翻译文件中的条目后,你可以使用 `--apply` 参数将更改应用于原始本地化文件: + +````bash +abp translate --apply # apply all changes +abp translate -a # shortcut for --apply +```` + +然后,检查源代码控制系统上的更改,以确保它已更改了正确的文件. 如果你翻译了ABP框架资源, 请发送 "Pull Request". 提前感谢你的贡献. + +##### 附加选项 + +* `--file` 或 `-f`: 默认值: `abp-translation.json`. 翻译文件(仅在之前使用过 `--output` 选项时使用). + +### login + +CLI的一些功能需要登录到abp.io平台. 使用你的用户名登录 + +```bash +abp login # Allows you to enter your password hidden +abp login -p # Specify the password as a parameter (password is visible) +abp login --organization # If you have multiple organizations, you need set your active organization +abp login -p -o # You can enter both your password and organization in the same command +``` + +> 当使用-p参数,请注意,因为你的密码是可见的. 它对于CI / CD自动化管道很有用. + +请注意,新的登录将终止先前的会话并创建一个新的会话. + +### logout + +通过从计算机中删除会话令牌来注销. + +``` +abp logout +``` diff --git a/docs/zh-Hans/Contribution/Index.md b/docs/zh-Hans/Contribution/Index.md index f3bafe9293..7b1c3544ef 100644 --- a/docs/zh-Hans/Contribution/Index.md +++ b/docs/zh-Hans/Contribution/Index.md @@ -1,8 +1,12 @@ -## 贡献指南 +# 贡献指南 ABP是[开源](https://github.com/abpframework)和社区驱动项目. 本指南旨在帮助任何想要为项目做出贡献的人. -### 贡献代码 +## community.abp.io + +如果你可编写文章或关于ASP框架和ASP.NET Core的 "如何" 指南,请提交你的文章到[community.abp.io](https://community.abp.io/)网站. + +## 贡献代码 你可以将Pull request(拉取请求)发送到Github存储库. @@ -12,15 +16,15 @@ ABP是[开源](https://github.com/abpframework)和社区驱动项目. 本指南 在进行任何更改之前,请在[Github问题](https://github.com/abpframework/abp/issues)上进行讨论. 通过这种方式, 其他开发人员将不会处理同一个问题, 你的PR将有更好的机会被接受. -#### Bug修复 & 增强功能 +### Bug修复 & 增强功能 你可能希望修复已知Bug或处理计划的增强功能. 请参阅Github上的[问题列表](https://github.com/abpframework/abp/issues). -#### 功能请求 +### 功能请求 如果你对框架或模块有功能的想法, 请在Github上[创建一个问题](https://github.com/abpframework/abp/issues/new)或参加现有的讨论. 如果它被社区所接受你就可以实现它. -### 文档翻译 +## 文档翻译 你可能希望将完整的[文档](https://abp.io/documents/)(包括本文)翻译成你的母语. 请按照下列步骤操作: @@ -37,13 +41,13 @@ ABP是[开源](https://github.com/abpframework)和社区驱动项目. 本指南 完成了这些基本的翻译后,将添加一种新的语言 -### 资源本地化 +## 资源本地化 ABP框架具有灵活的[本地化系统](../Localization.md). 你可以为自己的应用程序创建本地化用户界面. 除此之外,框架和预构建模块已经本地化了文本.请参阅[Volo.Abp.UI包的本地化文本](https://github.com/abpframework/abp/blob/master/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json). -#### 使用 "abp translate" 命令 +### 使用 "abp translate" 命令 这是推荐的方法,因为它会自动查找所有缺少的文本的特定文化,让你在一个地方翻译. @@ -54,14 +58,10 @@ ABP框架具有灵活的[本地化系统](../Localization.md). 你可以为自 * 一旦你完成了翻译,使用 `abp translate -a` 命令应用更改到相关的文件. * 在GitHub上发送PR. -#### 手动翻译 - -如果你想更改特定的资源文件,你可以自己找到这个文件进行必要的更改(或为你的语言创建新文件),并在GitHub上发送PR。 - -### 博客文章和教程 +### 手动翻译 -如果你发布了一些ABP框架的教程或博客帖子, 请通知我们(通过创建[Github问题](https://github.com/abpframework/abp/issues)), 我们可能会在官方文档中添加指向你的教程或博客帖子的链接和在[推特](https://twitter.com/abpframework)上公布. +如果你想更改特定的资源文件,你可以自己找到这个文件进行必要的更改(或为你的语言创建新文件),并在GitHub上发送PR. -### Bug 报告 +## Bug 报告 如果你发现任何Bug, 请[在Github存储库上创建一个问题](https://github.com/abpframework/abp/issues/new). \ No newline at end of file diff --git a/docs/zh-Hans/Customizing-Application-Modules-Extending-Entities.md b/docs/zh-Hans/Customizing-Application-Modules-Extending-Entities.md index 3e5ff3f6cd..6c895f71d2 100644 --- a/docs/zh-Hans/Customizing-Application-Modules-Extending-Entities.md +++ b/docs/zh-Hans/Customizing-Application-Modules-Extending-Entities.md @@ -43,7 +43,10 @@ return user.GetProperty("Title"); ObjectExtensionManager.Instance .MapEfCoreProperty( "SocialSecurityNumber", - b => { b.HasMaxLength(32); } + (entityBuilder, propertyBuilder) => + { + propertyBuilder.HasMaxLength(32); + } ); ```` diff --git a/docs/zh-Hans/Entities.md b/docs/zh-Hans/Entities.md index 190088753f..23ca3e73f0 100644 --- a/docs/zh-Hans/Entities.md +++ b/docs/zh-Hans/Entities.md @@ -226,6 +226,12 @@ ABP框架不强制你应用任何DDD规则或模式.但是,当你准备应用的 虽然这种聚合根并不常见(也不建议使用),但实际上可以按照与上面提到的跟实体相同的方式定义复合键.在这种情况下,要使用非泛型的`AggregateRoot`基类. +### BasicAggregateRoot类 + +`AggregateRoot` 类实现了 `IHasExtraProperties` 和 `IHasConcurrencyStamp` 接口,这为派生类带来了两个属性. `IHasExtraProperties` 使实体可扩展(请参见下面的 *额外的属性*部分) 和 `IHasConcurrencyStamp` 添加了由ABP框架管理的 `ConcurrencyStamp` 属性实现[乐观并发](https://docs.microsoft.com/zh-cn/ef/core/saving/concurrency). 在大多数情况下,这些是聚合根需要的功能. + +但是,如果你不需要这些功能,你的聚合根可以继承 `BasicAggregateRoot`(或`BasicAggregateRoot`). + ## 基类和接口的审计属性 有一些属性,像`CreationTime`,`CreatorId`,`LastModificationTime`...在所有应用中都很常见. ABP框架提供了一些接口和基类来**标准化**这些属性,并**自动设置它们的值**. diff --git a/docs/zh-Hans/Entity-Framework-Core-Migrations.md b/docs/zh-Hans/Entity-Framework-Core-Migrations.md index 876d98721b..c6f1086540 100644 --- a/docs/zh-Hans/Entity-Framework-Core-Migrations.md +++ b/docs/zh-Hans/Entity-Framework-Core-Migrations.md @@ -414,7 +414,10 @@ public static class MyProjectNameEntityExtensions ObjectExtensionManager.Instance .MapEfCoreProperty( "Title", - builder => { builder.HasMaxLength(64); } + (entityBuilder, propertyBuilder) => + { + propertyBuilder.HasMaxLength(128); + } ); }); } diff --git a/docs/zh-Hans/Entity-Framework-Core.md b/docs/zh-Hans/Entity-Framework-Core.md index 5ae6ce1070..211ec4d65f 100644 --- a/docs/zh-Hans/Entity-Framework-Core.md +++ b/docs/zh-Hans/Entity-Framework-Core.md @@ -325,7 +325,10 @@ public class BookService ObjectExtensionManager.Instance .MapEfCoreProperty( "Title", - builder => { builder.HasMaxLength(64); } + (entityBuilder, propertyBuilder) => + { + propertyBuilder.HasMaxLength(64); + } ); ```` diff --git a/docs/zh-Hans/Getting-Started-Console-Application.md b/docs/zh-Hans/Getting-Started-Console-Application.md deleted file mode 100644 index 1bf48cefd4..0000000000 --- a/docs/zh-Hans/Getting-Started-Console-Application.md +++ /dev/null @@ -1,3 +0,0 @@ -## 在控制台应用中使用ABP - -ABP提供了控制台应用程序启动模板. 参阅[控制台应用程序启动模板]文档了解更多信息. \ No newline at end of file diff --git a/docs/zh-Hans/Global-Features.md b/docs/zh-Hans/Global-Features.md new file mode 100644 index 0000000000..776d4e0718 --- /dev/null +++ b/docs/zh-Hans/Global-Features.md @@ -0,0 +1,3 @@ +# Global Features + +TODO... \ No newline at end of file diff --git a/docs/zh-Hans/How-To/Index.md b/docs/zh-Hans/How-To/Index.md deleted file mode 100644 index 3190ced7ca..0000000000 --- a/docs/zh-Hans/How-To/Index.md +++ /dev/null @@ -1,9 +0,0 @@ -# "如何" 指南 - -本部分包含一些常见问题的 "如何" 指南. 尽管其中是一些常见的开发任务和ABP并不直接相关,但我们认为有一些具体的示例可以直接与基于ABP的应用程序一起使用. - -## Authentication - -* [如何为MVC / Razor页面应用程序自定义登录页面](Customize-Login-Page-MVC.md) -* [如何对MVC / Razor页面应用程序使用Azure Active Directory身份验证](Azure-Active-Directory-Authentication-MVC.md) -* [如何为ABP应用程序定制SignIn Manager](Customize-SignIn-Manager.md) \ No newline at end of file diff --git a/docs/zh-Hans/Local-Event-Bus.md b/docs/zh-Hans/Local-Event-Bus.md index 44e21d0384..3a955e90d7 100644 --- a/docs/zh-Hans/Local-Event-Bus.md +++ b/docs/zh-Hans/Local-Event-Bus.md @@ -156,6 +156,8 @@ namespace AbpDemo > 事件处理程序类必须注册到依赖注入(DI),示例中使用了 `ITransientDependency`. 参阅[DI文档](Dependency-Injection.md)了解更多选项. +如果您执行**数据库操作**并在事件处理程序中使用[仓储](Repositories.md),那么您可能需要创建一个[工作单元](Unit-Of-Work.md),因为一些存储库方法需要在**活动的工作单元**中工作. 确保处理方法设置为 `virtual`,并为该方法添加一个 `[UnitOfWork]` attribute. 或者手动使用 `IUnitOfWorkManager` 创建一个工作单元范围. + ## 事务和异常行为 当一个事件发布,订阅的事件处理程序将立即执行.所以; diff --git a/docs/zh-Hans/MailKit.md b/docs/zh-Hans/MailKit.md new file mode 100644 index 0000000000..cb82a640d5 --- /dev/null +++ b/docs/zh-Hans/MailKit.md @@ -0,0 +1 @@ +TODO... \ No newline at end of file diff --git a/docs/zh-Hans/Module-Development-Basics.md b/docs/zh-Hans/Module-Development-Basics.md index e43c57d0b2..1e1e9a42cd 100644 --- a/docs/zh-Hans/Module-Development-Basics.md +++ b/docs/zh-Hans/Module-Development-Basics.md @@ -1,4 +1,4 @@ -## 模块开发 +## 模块化 ### 介绍 diff --git a/docs/zh-Hans/Moodule-Entity-Extensions.md b/docs/zh-Hans/Moodule-Entity-Extensions.md new file mode 100644 index 0000000000..6e8c73c2a2 --- /dev/null +++ b/docs/zh-Hans/Moodule-Entity-Extensions.md @@ -0,0 +1,3 @@ +# Module Entity Extensions + +参阅 https://docs.abp.io/en/commercial/latest/guides/module-entity-extensions (文档会在近期完成). \ No newline at end of file diff --git a/docs/zh-Hans/Nightly-Builds.md b/docs/zh-Hans/Nightly-Builds.md index 020d69e02e..14a5b8ad8c 100644 --- a/docs/zh-Hans/Nightly-Builds.md +++ b/docs/zh-Hans/Nightly-Builds.md @@ -2,40 +2,18 @@ 所有框架和模块包每晚都部署到MyGet. 因此你可以使用或测试最新的代码,而无需等待下一个版本. -## 在Visual Studio配置 +## 安装和卸载每晚预览包 -> 需要Visual Studio 2017以上 - -1. 在VS中打开: `工具 > 选项 > NuGet 包管理器 > 程序包源` -2. 单击绿色的`+`图标 -3. 在底部输入名称(ABP Nightly)和并粘贴URL(`https://www.myget.org/F/abp-nightly/api/v3/index.json`)到源上. - ![night-build-add-nuget-source](images/night-build-add-nuget-source.png) -3. 单击`更新`按钮 -4. 点击`确定`按钮保存 - -## 安装包 - -现在, 你可以从**管理NuGet包** 或 **程序包管理器控制台** 将预览/夜间程序包安装到你的项目中. - -![night-build-add-nuget-package](images/night-build-add-nuget-package.png) - -1. 在nuget浏览中,选择"包括预发行版". -2. 将包源更改为`全部`. -3. 搜索nuget包. 你将看到包的预发布格式为`(VERSION)-preview(DATE)` (如本示例中的**v0.16.0-preview20190401**). -4. 你可以单击`安装`按钮将包添加到项目中. - -## 安装和卸载预览NPM包 - -预览NPM包的最新版本可以通过在应用程序的根文件夹命令运行命令安装: +可以通过在应用程序的根文件夹中运行以下命令安装最新版本的夜间预览软件包: ```bash -abp switch-to-preview --npm +abp switch-to-nightly ``` -如果你正在使用ABP框架预览包,你可以使用此命令切换回稳定版本: +如果你正在使用ABP框架每晚预览包,你可以使用此命令切换回稳定版本: ```bash -abp switch-to-stable --npm +abp switch-to-stable ``` 参阅 [ABP CLI 文档](./CLI.md) 了解更多信息. \ No newline at end of file diff --git a/docs/zh-Hans/Previews.md b/docs/zh-Hans/Previews.md new file mode 100644 index 0000000000..cb82a640d5 --- /dev/null +++ b/docs/zh-Hans/Previews.md @@ -0,0 +1 @@ +TODO... \ No newline at end of file diff --git a/docs/zh-Hans/Repositories.md b/docs/zh-Hans/Repositories.md index ee48186985..79186b79da 100644 --- a/docs/zh-Hans/Repositories.md +++ b/docs/zh-Hans/Repositories.md @@ -6,7 +6,11 @@ ## 通用(泛型)仓储 -ABP为每个聚合根或实体提供了 **默认的通用(泛型)仓储** . 你可以在服务中[注入](Dependency-Injection.md) `IRepository` 使用标准的**CRUD**操作. 用法示例: +ABP为每个聚合根或实体提供了 **默认的通用(泛型)仓储** . 你可以在服务中[注入](Dependency-Injection.md) `IRepository` 使用标准的**CRUD**操作. + +> 数据库提供程序层应正确配置为能够使用默认的通用存储库. 如果你已经使用启动模板创建了项目,则这些配置 **已经完成**了. 如果不是,请参考数据库提供程序文档([EF Core](Entity-Framework-Core.md) / [MongoDB](MongoDB.md))进行配置. + +**默认通用仓储用法示例:** ````C# public class PersonAppService : ApplicationService diff --git a/docs/zh-Hans/Samples/Index.md b/docs/zh-Hans/Samples/Index.md index 94e5392b51..db2e680883 100644 --- a/docs/zh-Hans/Samples/Index.md +++ b/docs/zh-Hans/Samples/Index.md @@ -15,17 +15,14 @@ 一个简单的CRUD应用程序,展示了使用ABP框架开发应用程序的基本原理. 使用不同的技术实现了相同的示例: * **Book Store: Razor Pages UI & Entity Framework Core** - - * [教程](https://docs.abp.io/en/abp/latest/Tutorials/Part-1?UI=MVC) - * [源码](https://github.com/abpframework/abp-samples/tree/master/BookStore) + * [教程](https://docs.abp.io/en/abp/latest/Tutorials/Part-1?UI=MVC&DB=EF) + * [源码](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore) * **Book Store: Angular UI & MongoDB** - - * [教程](https://docs.abp.io/en/abp/latest/Tutorials/Part-1?UI=NG) + * [教程](https://docs.abp.io/en/abp/latest/Tutorials/Part-1?UI=NG&DB=Mongo) * [源码](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb) * **Book Store: Modular application (Razor Pages UI & EF Core)** - * [源码](https://github.com/abpframework/abp-samples/tree/master/BookStore-Modular) 如果没有Razor Pages & MongoDB 结合,但你可以检查两个文档来理解它,因为DB和UI不会互相影响. @@ -33,11 +30,14 @@ ### 其他示例 * **Entity Framework 迁移**: 演示如何将应用程序拆分为多个数据库的解决方案. 每个数据库包含不同的模块. - * [源码](https://github.com/abpframework/abp-samples/tree/master/DashboardDemo) + * [源码](https://github.com/abpframework/abp-samples/tree/master/EfCoreMigrationDemo) * [EF Core数据库迁移文档](../Entity-Framework-Core-Migrations.md) * **SignalR Demo**: A simple chat application that allows to send and receive messages among authenticated users. * [源码](https://github.com/abpframework/abp-samples/tree/master/SignalRDemo) * [SignalR 集成文档](../SignalR-Integration.md) +* **分布式架构中的实时消息** (使用 SingalR & RabbitMQ) + * [源码](https://github.com/abpframework/abp-samples/tree/master/SignalRTieredDemo) + * [文章](https://community.abp.io/articles/real-time-messaging-in-a-distributed-architecture-using-abp-framework-singalr-rabbitmq-daf47e17) * **Dashboard Demo**: 一个简单的应用程序,展示了如何在ASP.NET Core MVC UI中使用widget系统. * [源码](https://github.com/abpframework/abp-samples/tree/master/DashboardDemo) * [Widget 文档](../UI/AspNetCore/Widgets.md) @@ -50,15 +50,20 @@ * [文本模板文档](../Text-Templating.md) * **存储过程 Demo**: 演示如何以最佳实践使用存储过程,数据库视图和函数. * [源码](https://github.com/abpframework/abp-samples/tree/master/StoredProcedureDemo) +* **无密码认证**: 演示如何添加自定义令牌提供者使用链接验证用户身份,而不是输入密码. + * [源码](https://github.com/abpframework/abp-samples/tree/master/PasswordlessAuthentication) + * [文章](https://community.abp.io/articles/implementing-passwordless-authentication-with-asp.net-core-identity-c25l8koj) * **自定义认证**: 如何为ASP.NET Core MVC / Razor Pages应用程序自定义身份验证的解决方案. * [源码](https://github.com/abpframework/abp-samples/tree/master/Authentication-Customization) - * 相关 "[How To](../How-To/Index.md)" 文档: - * [Azure Active Directory 认证](../How-To/Azure-Active-Directory-Authentication-MVC.md) - * [自定义登录页面](../How-To/Customize-Login-Page-MVC.md) - * [自定义 SignIn Manager](../How-To/Customize-SignIn-Manager.md) + * 相关文章: + * [Azure Active Directory 认证](https://community.abp.io/articles/how-to-use-the-azure-active-directory-authentication-for-mvc-razor-page-applications-4603b9cf) + * [自定义登录页面](https://community.abp.io/articles/how-to-customize-the-login-page-for-mvc-razor-page-applications-9a40f3cd) + * [自定义 SignIn Manager](https://community.abp.io/articles/how-to-customize-the-signin-manager-3e858753) * **空的ASP.NET Core应用程序**: 从基本的ASP.NET Core应用程序使用ABP框架. * [源码](https://github.com/abpframework/abp-samples/tree/master/BasicAspNetCoreApplication) * [文档](../Getting-Started-AspNetCore-Application.md) +* **GRPC Demo**: 演示如何将gRPC服务添加到基于ABP框架的Web应用程序以及如何从控制台应用程序使用它. + * [源码](https://github.com/abpframework/abp-samples/tree/master/GrpcDemo) * **空的控制台应用程序**: 从基本的控制台应用程序安装ABP框架. * [源码](https://github.com/abpframework/abp-samples/tree/master/BasicConsoleApplication) * [文档](../Getting-Started-Console-Application.md) \ No newline at end of file diff --git a/docs/zh-Hans/Startup-Templates/Application.md b/docs/zh-Hans/Startup-Templates/Application.md index 534a26d8fb..58287cef5a 100644 --- a/docs/zh-Hans/Startup-Templates/Application.md +++ b/docs/zh-Hans/Startup-Templates/Application.md @@ -59,6 +59,20 @@ abp new Acme.BookStore -d mongodb ### 指定移动应用程序框架 +此模板支持以下移动应用程序框架: + +- `react-native`: React Native + +使用 `-m` (或 `--mobile`) 选项指定移动应用程序框架: + +````bash +abp new Acme.BookStore -m react-native +```` + +如果未指定,不会创建移动应用程序. + +### 指定移动应用程序框架 + 该模板支持以下移动应用程序框架: - `react-native`: React Native diff --git a/docs/zh-Hans/UI/Angular/Environment.md b/docs/zh-Hans/UI/Angular/Environment.md new file mode 100644 index 0000000000..cb82a640d5 --- /dev/null +++ b/docs/zh-Hans/UI/Angular/Environment.md @@ -0,0 +1 @@ +TODO... \ 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 index eb16c21e03..fd40affc55 100644 --- a/docs/zh-Hans/UI/Angular/Migration-Guide-v3.md +++ b/docs/zh-Hans/UI/Angular/Migration-Guide-v3.md @@ -450,4 +450,4 @@ export function switchLogos(store: Store) { ## 下一步是什么? -* [服务代理](Service-Proxies.md) \ No newline at end of file +* [环境](./Environment.md) \ No newline at end of file diff --git a/docs/zh-Hans/UI/Angular/Multi-Tenancy.md b/docs/zh-Hans/UI/Angular/Multi-Tenancy.md new file mode 100644 index 0000000000..cb82a640d5 --- /dev/null +++ b/docs/zh-Hans/UI/Angular/Multi-Tenancy.md @@ -0,0 +1 @@ +TODO... \ No newline at end of file diff --git a/docs/zh-Hans/UI/Angular/Permission-Management.md b/docs/zh-Hans/UI/Angular/Permission-Management.md index 7f28035105..08496f03fe 100644 --- a/docs/zh-Hans/UI/Angular/Permission-Management.md +++ b/docs/zh-Hans/UI/Angular/Permission-Management.md @@ -4,7 +4,7 @@ 你可以使用 `ConfigState` 的 `getGrantedPolicy` 选择器获取经过身份验证的用户的权限. -你可以从Store中获取权限的布尔值: +你可以获取权限的布尔值: ```js import { Store } from '@ngxs/store'; @@ -78,4 +78,4 @@ const routes: Routes = [ ## 下一步是什么? -* [确认弹层](./Confirmation-Service.md) \ No newline at end of file +* [多租户](./Multi-Tenancy.md) \ No newline at end of file diff --git a/docs/zh-Hans/UI/Angular/Toaster-Service.md b/docs/zh-Hans/UI/Angular/Toaster-Service.md index 045cf9f2cf..405e1b6400 100644 --- a/docs/zh-Hans/UI/Angular/Toaster-Service.md +++ b/docs/zh-Hans/UI/Angular/Toaster-Service.md @@ -24,7 +24,7 @@ class DemoComponent { ### 如何显示一个Toast Overlay ```js -this.toast.success('Message', 'Title'); +this.toaster.success('Message', 'Title'); ``` - `ToasterService` 方法接收三个参数,分别是 `message`, `title`, 和 `options`. @@ -70,9 +70,9 @@ const options: Partial = { 已打开的toast overlay可以通过手动调用 `remove` 方法传递指定的 toast `id`删除. ```js -const toastId = this.toast.success('Message', 'Title') +const toastId = this.toaster.success('Message', 'Title') -this.toast.remove(toastId); +this.toaster.remove(toastId); ``` ### 如何删除所有的Toasts @@ -80,7 +80,7 @@ this.toast.remove(toastId); 可以手动调用 `clear` 方法删除所有的已打开的toasts. ```js -this.toast.clear(); +this.toaster.clear(); ``` ## API diff --git a/docs/zh-Hans/UI/AspNetCore/Customization-User-Interface.md b/docs/zh-Hans/UI/AspNetCore/Customization-User-Interface.md index c4a90a9f1a..7daf6c5d4b 100644 --- a/docs/zh-Hans/UI/AspNetCore/Customization-User-Interface.md +++ b/docs/zh-Hans/UI/AspNetCore/Customization-User-Interface.md @@ -157,7 +157,7 @@ public class MyLoginModel : LoginModel ## 重写静态资源 -重写模块的静态资源(像JavaScript,Css或图片文件)是很简单的. 只需要在解决方案的相同路径创建文件,虚拟文件系统会自动处理它. +重写模块的静态资源(像JavaScript,Css或图片文件)是很简单的. 只需要在解决方案的相同路径创建文件,[虚拟文件系统](../../Virtual-File-System.md)会自动处理它. ## 操作捆绑 diff --git a/docs/zh-Hans/Upgrading.md b/docs/zh-Hans/Upgrading.md new file mode 100644 index 0000000000..cb82a640d5 --- /dev/null +++ b/docs/zh-Hans/Upgrading.md @@ -0,0 +1 @@ +TODO... \ No newline at end of file diff --git a/docs/zh-Hans/Virtual-File-System.md b/docs/zh-Hans/Virtual-File-System.md index 6952c4d5da..4fcf861000 100644 --- a/docs/zh-Hans/Virtual-File-System.md +++ b/docs/zh-Hans/Virtual-File-System.md @@ -74,53 +74,12 @@ Configure(options => * 你的项目有一个名为 `MyFiles` 的目录. * 你只想添加 `MyFiles` 目录到虚拟文件系统. -#### 在开发过程中处理嵌入式文件 - -将文件嵌入到模块程序集中并能够通过引用程序集(或添加nuget包)在另一个项目中使用它对于创建可重用模块非常有价值. 但是, 这使得开发模块本身变得有点困难. - -假设你正在开发一个包含嵌入式JavaScript文件的模块. 当你更改文件时, 你必须重新编译项目, 重新启动应用程序并刷新浏览器页面以使更改生效. 显然, 这是非常耗时和乏味的. - -我们需要的是应用程序在开发时直接使用物理文件的能力, 让浏览器刷新时同步JavaScript文件的任何更改. `ReplaceEmbeddedByPhysical` 方法使其成为可能. - -下面的示例展示了应用程序依赖于包含嵌入文件的模块("MyModule"), 并且应用程序可以在开发过程中直接使用模块的源代码. - -````C# -[DependsOn(typeof(MyModule))] -public class MyWebAppModule : AbpModule -{ - public override void ConfigureServices(ServiceConfigurationContext context) - { - var hostingEnvironment = context.Services.GetHostingEnvironment(); - - if (hostingEnvironment.IsDevelopment()) //only for development time - { - Configure(options => - { - options.FileSets.ReplaceEmbeddedByPhysical( - Path.Combine( - hostingEnvironment.ContentRootPath, - string.Format( - "..{0}MyModuleProject", - Path.DirectorySeparatorChar - ) - ) - ); - }); - } - } -} -```` - -上面的代码假设`MyWebAppModule`和`MyModule`是Visual Studio解决方案中的两个不同的项目, `MyWebAppModule`依赖于`MyModule`. - -> [应用程序启动模板]已经为本地化文件应用这个方法,所以当你更改一个本地化文件时,它会自动检测到更改. - ## IVirtualFileProvider 将文件嵌入到程序集中并注册到虚拟文件系统后,可以使用 `IVirtualFileProvider` 接口来获取文件或目录内容: ````C# -public class MyService +public class MyService : ITransientDependency { private readonly IVirtualFileProvider _virtualFileProvider; @@ -129,7 +88,7 @@ public class MyService _virtualFileProvider = virtualFileProvider; } - public void Foo() + public void Test() { //Getting a single file var file = _virtualFileProvider @@ -154,7 +113,9 @@ public class MyService #### 虚拟文件中间件 -虚拟文件中间件用于向客户端/浏览器提供嵌入式(js, css, image ...)文件, 就像 **wwwroot** 文件夹中的物理(静态)文件一样. 在静态文件中间件之后添加它, 如下所示: +虚拟文件中间件用于向客户端/浏览器提供嵌入式(js, css, image ...)文件, 就像 **wwwroot** 文件夹中的物理(静态)文件一样. 它同时涵盖了物理文件. + +在你ASP.NET Core中间件配置中替换 `app.UseStaticFiles()` 为 `app.UseVirtualFiles()`: ````C# app.UseVirtualFiles(); @@ -170,6 +131,62 @@ app.UseVirtualFiles(); * Pages * Views +* Components * Themes 这允许你可以在 `.cshtml` 文件附近添加 `.js`, `.css`... 文件,更易于开发和维护你的项目. + +#### 在开发过程中处理嵌入式文件 + +将文件嵌入到模块程序集中并能够通过引用程序集(或添加nuget包)在另一个项目中使用它对于创建可重用模块非常有价值. 但是, 这使得开发模块本身变得有点困难. + +假设你正在开发一个包含嵌入式JavaScript文件的模块. 当你更改文件时, 你必须重新编译项目, 重新启动应用程序并刷新浏览器页面以使更改生效. 显然, 这是非常耗时和乏味的. + +我们需要的是应用程序在开发时直接使用物理文件的能力, 让浏览器刷新时同步JavaScript文件的任何更改. `ReplaceEmbeddedByPhysical` 方法使其成为可能. + +下面的示例展示了应用程序依赖于包含嵌入文件的模块("MyModule"), 并且应用程序可以在开发过程中直接使用模块的源代码. + +````C# +[DependsOn(typeof(MyModule))] +public class MyWebAppModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + var hostingEnvironment = context.Services.GetHostingEnvironment(); + + if (hostingEnvironment.IsDevelopment()) //only for development time + { + Configure(options => + { + options.FileSets.ReplaceEmbeddedByPhysical( + Path.Combine( + hostingEnvironment.ContentRootPath, + string.Format( + "..{0}MyModuleProject", + Path.DirectorySeparatorChar + ) + ) + ); + }); + } + } +} +```` + +上面的代码假设`MyWebAppModule`和`MyModule`是Visual Studio解决方案中的两个不同的项目, `MyWebAppModule`依赖于`MyModule`. + +> [应用程序启动模板]已经为本地化文件应用这个方法,所以当你更改一个本地化文件时,它会自动检测到更改. + +## 替换/重写虚拟文件 + +虚拟文件系统在运行时创建一个统一的文件系统,其中实际的文件在开发时被分配到不同的模块中. + +如果两个模块将文件添加到相同的虚拟路径(如`my-path/my-file.css`),之后添加的模块将替换/替换前一个([模块依赖](Module-Development-Basics.md)顺序决定了添加文件的顺序). + +此功能允许你的应用程序可以覆盖/替换定义应用程序所使用的模块的任何虚拟文件. 这是ABP框架的基本可扩展性功能之一. + +因此,如果需要替换模块的文件,只需在模块/应用程序中完全相同的路径中创建该文件. + +### 物理文件 + +物理文件总是覆盖虚拟文件. 这意味着如果你把一个文件放在 `/wwwroot/my-folder/my-file.css`,它将覆盖虚拟文件系统相同位置的文件.因此你需要知道在模块中定义的文件路径来覆盖它们. \ No newline at end of file diff --git a/docs/zh-Hans/docs-nav.json b/docs/zh-Hans/docs-nav.json index df72d6e3df..5df3376507 100644 --- a/docs/zh-Hans/docs-nav.json +++ b/docs/zh-Hans/docs-nav.json @@ -4,21 +4,16 @@ "text": "入门", "items": [ { - "text": "从启动模板开始", + "text": "Web应用程序", "path": "Getting-Started.md" }, { - "text": "从空项目开始", - "items": [ - { - "text": "使用ASP.NET Core Web Application", - "path": "Getting-Started-AspNetCore-Application.md" - }, - { - "text": "使用Console Application", - "path": "Getting-Started-Console-Application.md" - } - ] + "text": "控制台应用程序", + "path": "Startup-Templates/Console.md" + }, + { + "text": "空Web应用程序t", + "path": "Getting-Started-AspNetCore-Application.md" } ] }, @@ -66,10 +61,6 @@ } ] }, - { - "text": "\"如何\" 指南", - "path": "How-To/Index.md" - }, { "text": "从ASP.NET Boilerplate迁移", "path": "AspNet-Boilerplate-Migration-Guide.md" @@ -201,6 +192,19 @@ "path": "Object-To-Object-Mapping.md" }, + { + "text": "邮件发送", + "items": [ + { + "text": "邮件发送系统", + "path": "Emailing.md" + }, + { + "text": "MailKit集成", + "path": "MailKit.md" + } + ] + }, { "text": "BLOB存储", "items": [ @@ -397,6 +401,10 @@ "text": "v2.x 到 v3 迁移指南", "path": "UI/Angular/Migration-Guide-v3.md" }, + { + "text": "环境", + "path": "UI/Angular/Environment.md" + }, { "text": "服务代理", "path": "UI/Angular/Service-Proxies.md" @@ -413,6 +421,10 @@ "text": "权限管理", "path": "UI/Angular/Permission-Management.md" }, + { + "text": "多租户", + "path": "UI/Angular/Multi-Tenancy.md" + }, { "text": "确认弹层", "path": "UI/Angular/Confirmation-Service.md" @@ -635,6 +647,10 @@ "text": "微服务架构", "path": "Microservice-Architecture.md" }, + { + "text": "预览版本", + "path": "Previews.md" + }, { "text": "每日构建", "path": "Nightly-Builds.md" @@ -643,6 +659,10 @@ "text": "路线图", "path": "Road-Map.md" }, + { + "text": "升级", + "path": "Upgrading.md" + }, { "text": "贡献指南", "path": "Contribution/Index.md" diff --git a/docs/zh-Hans/images/replace-email-layout.png b/docs/zh-Hans/images/replace-email-layout.png new file mode 100644 index 0000000000000000000000000000000000000000..67db895f92a549bb4ddadf1606e6c97737cf5fd9 GIT binary patch literal 31878 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 literal 5658 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 From df780227f5f0486ae0c56d5ae26c326922fd8631 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Sun, 6 Sep 2020 21:05:22 +0300 Subject: [PATCH 062/116] fix: use an intersection type for strict null checks --- npm/ng-packs/packages/core/src/lib/models/config.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/models/config.ts b/npm/ng-packs/packages/core/src/lib/models/config.ts index be640a4dcf..cf4eb007c9 100644 --- a/npm/ng-packs/packages/core/src/lib/models/config.ts +++ b/npm/ng-packs/packages/core/src/lib/models/config.ts @@ -22,11 +22,12 @@ export namespace Config { logoUrl?: string; } - export interface ApiConfig { + export type ApiConfig = { [key: string]: string; - rootNamespace?: string; url: string; - } + } & Partial<{ + rootNamespace: string; + }>; export interface Apis { [key: string]: ApiConfig; From fe8417cce460a9a37929f493f494f71bed12f7eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 6 Sep 2020 21:47:23 +0300 Subject: [PATCH 063/116] Add link to the article. --- docs/en/UI/Angular/Service-Proxies.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/en/UI/Angular/Service-Proxies.md b/docs/en/UI/Angular/Service-Proxies.md index 40fb18f45d..5466d64182 100644 --- a/docs/en/UI/Angular/Service-Proxies.md +++ b/docs/en/UI/Angular/Service-Proxies.md @@ -1,5 +1,7 @@ ## Service Proxies +> THIS DOCUMENT IS OUTDATED. IT IS BEING UPDATED. MEANWHILE, YOU CAN [SEE THIS ARTICLE](https://github.com/abpframework/abp/blob/dev/docs/en/Blog-Posts/2020-09-07%20Angular-Service-Proxies/POST.md) TO LEARN HOW TO USE THE ABP ANGULAR SERVICE PROXIES. + It is common to call a REST endpoint in the server from our Angular applications. In this case, we generally create **services** (those have methods for each service method on the server side) and **model objects** (matches to [DTOs](../../Data-Transfer-Objects) in the server side). In addition to manually creating such server-interacting services, we could use tools like [NSWAG](https://github.com/RicoSuter/NSwag) to generate service proxies for us. But NSWAG has the following problems we've experienced: From 57697b59c016492bf1650e0f5e8c8d8c508fd8e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 6 Sep 2020 21:47:59 +0300 Subject: [PATCH 064/116] Delete abp-generate-proxy-output.png --- .../abp-generate-proxy-output.png | Bin 42515 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/en/Blog-Posts/2020-09-07 Angular-Service-Proxies/abp-generate-proxy-output.png diff --git a/docs/en/Blog-Posts/2020-09-07 Angular-Service-Proxies/abp-generate-proxy-output.png b/docs/en/Blog-Posts/2020-09-07 Angular-Service-Proxies/abp-generate-proxy-output.png deleted file mode 100644 index 0a77d8e40fe256f7443fe81b4552d310414f31f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42515 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 Date: Mon, 7 Sep 2020 09:01:30 +0300 Subject: [PATCH 065/116] CmsKit: Range attribute changes as DynamicRange --- .../Volo/CmsKit/Ratings/RatingConsts.cs | 4 ++-- .../Volo/CmsKit/Public/Ratings/CreateUpdateRatingInput.cs | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Ratings/RatingConsts.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Ratings/RatingConsts.cs index d52bec599b..e3bf6c399d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Ratings/RatingConsts.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Ratings/RatingConsts.cs @@ -8,8 +8,8 @@ namespace Volo.CmsKit.Ratings public static int MaxEntityIdLength { get; set; } = CmsEntityConsts.MaxEntityIdLength; - public const int MaxStarCount = 5; + public static int MaxStarCount { get; set; } = 5; - public const int MinStarCount = 1; + public static int MinStarCount { get; set; } = 1; } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/CreateUpdateRatingInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/CreateUpdateRatingInput.cs index c6fa01b7d4..0577a97a68 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/CreateUpdateRatingInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Ratings/CreateUpdateRatingInput.cs @@ -1,11 +1,13 @@ using System.ComponentModel.DataAnnotations; +using Volo.Abp.Validation; using Volo.CmsKit.Ratings; namespace Volo.CmsKit.Public.Ratings { public class CreateUpdateRatingInput { - [Required, Range(RatingConsts.MinStarCount, RatingConsts.MaxStarCount)] + [Required] + [DynamicRange(typeof(RatingConsts), typeof(int), nameof(RatingConsts.MinStarCount), nameof(RatingConsts.MaxStarCount))] public short StarCount { get; set; } } } \ No newline at end of file From ccd7f18e7f47055619622527e213fb63bba5f4ae Mon Sep 17 00:00:00 2001 From: Alper Ebicoglu Date: Mon, 7 Sep 2020 09:20:33 +0300 Subject: [PATCH 066/116] Update POST.md --- .../POST.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/en/Community-Articles/2020-08-31-Adding-User-Navigation-In-Suite/POST.md b/docs/en/Community-Articles/2020-08-31-Adding-User-Navigation-In-Suite/POST.md index 2cb53e92fd..7bfd20637f 100644 --- a/docs/en/Community-Articles/2020-08-31-Adding-User-Navigation-In-Suite/POST.md +++ b/docs/en/Community-Articles/2020-08-31-Adding-User-Navigation-In-Suite/POST.md @@ -24,7 +24,7 @@ Then add a string property called `Title`, as an example property. ABP Suite needs a DTO for the target entity (user, in this case) in order to define a navigation property. -To do this, create a new folder called "Users" in `*.Application.Contracts` then add a new class called `AppUserDto` inherited from `IdentityUserDto`. +To do this, create a new folder called "Users" in `*.Application.Contracts` then add a new class called `AppUserDto` inherited from `IdentityUserDto`. ![create-appuserdto](create-appuserdto.jpg) @@ -40,13 +40,13 @@ CreateMap().Ignore(x => x.ExtraProperties); ### Define the Navigation Property -Get back to ABP Suite, open the **Navigation Properties** tab of the ABP Suite, click the **Add Navigation Property** button. Browse `AppUser.cs` in `*.Domain\Users` folder. Then choose the `Name` item as display property. Browse `AppUserDto.cs` in `*.Contracts\Users` folder. Choose `Users` from Collection Names dropdown. +Get back to ABP Suite, open the **Navigation Properties** tab of the ABP Suite, click the **Add Navigation Property** button. Browse `AppUser.cs` in `*.Domain\Users` folder. Then choose the `Name` item as display property. Browse `AppUserDto.cs` in `*.Contracts\Users` folder. Choose `Users` from Collection Names dropdown. ![add-user-navigation](add-user-navigation.jpg) ### Generate the Code! -That's it! Click **Save and generate** button to create your page. You'll see the following page if everything goes well. +That's it! Click **Save and generate** button to create your page. You'll see the following page if everything goes well. ![final-page](final-page.jpg) @@ -54,7 +54,7 @@ This is the new page that has been created by the ABP Suite. It can perform the **Picking Users from Look Up Table** -We used dropdown element to select a user from the user list. If you have a lot of users, then it's good to pick a user from a look up table. A look up table is a modal window that lets you filter data and pick one. To do this, get back to Suite and click **Edit** button of user navigation which is set as `AppUserId` name. Choose "Modal" from the "UI Pick Type" field. Then click **Save and generate** button to recreate your page. +We used dropdown element to select a user from the user list. If you have a lot of users, then it's good to pick a user from a look up table. A look up table is a modal window that lets you filter data and pick one. To do this, get back to Suite and click **Edit** button of user navigation which is set as `AppUserId` name. Choose "Modal" from the "UI Pick Type" field. Then click **Save and generate** button to recreate your page. ![ui-pick-type-modal](ui-pick-type-modal.jpg) @@ -64,18 +64,18 @@ After successful code generation, you'll see the the user can be picked from use ## About the ABP Commercial RC -This example has been implemented with **ABP Commercial 3.1.0-rc.3**. This is a RC version. If you want to install the CLI and Suite RC version follow the next steps: +This example has been implemented with **ABP Commercial 3.1.0**. If you have not installed the ABP CLI and ABP Suite, follow the next steps: -1- Uninstall the current version of the CLI and install the specific RC version: +1- Uninstall the current version of the CLI and install: ```bash -dotnet tool uninstall --global Volo.Abp.Cli && dotnet tool install --global Volo.Abp.Cli --version 3.1.0-rc.3 +dotnet tool install --global Volo.Abp.Cli --version 3.1.0 ``` -2- Uninstall the current version of the Suite and install the specific RC version: +2- Uninstall the current version of the Suite and install: ```bash -dotnet tool uninstall --global Volo.Abp.Suite && dotnet tool install -g Volo.Abp.Suite --version 3.1.0-rc.3 --add-source https://nuget.abp.io//v3/index.json +dotnet tool uninstall --global Volo.Abp.Suite && dotnet tool install -g Volo.Abp.Suite --version 3.1.0 --add-source https://nuget.abp.io//v3/index.json ``` Don't forget to replace the `` with your own key! From 80a1b0bfdb35faca35f8d7ef5161d7c6b211eca9 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 7 Sep 2020 17:22:02 +0800 Subject: [PATCH 067/116] Add unadded users/roles method to OrganizationUnitRepository --- .../Identity/IOrganizationUnitRepository.cs | 16 ++++++ .../Volo/Abp/Identity/OrganizationUnit.cs | 10 ++-- .../EfCoreOrganizationUnitRepository.cs | 52 +++++++++++++++++-- .../MongoOrganizationUnitRepository.cs | 37 +++++++++++++ .../OrganizationUnitRepository_Tests.cs | 21 ++++++++ 5 files changed, 128 insertions(+), 8 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IOrganizationUnitRepository.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IOrganizationUnitRepository.cs index 6650f62c82..81474425db 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IOrganizationUnitRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IOrganizationUnitRepository.cs @@ -55,6 +55,14 @@ namespace Volo.Abp.Identity CancellationToken cancellationToken = default ); + Task> GetUnaddedRolesAsync( + OrganizationUnit organizationUnit, + string filter = null, + string sorting = null, + bool includeDetails = false, + CancellationToken cancellationToken = default + ); + Task> GetMembersAsync( OrganizationUnit organizationUnit, string sorting = null, @@ -71,6 +79,14 @@ namespace Volo.Abp.Identity CancellationToken cancellationToken = default ); + Task> GetUnaddedUsersAsync( + OrganizationUnit organizationUnit, + string filter = null, + string sorting = null, + bool includeDetails = false, + CancellationToken cancellationToken = default + ); + Task RemoveAllRolesAsync( OrganizationUnit organizationUnit, CancellationToken cancellationToken = default diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/OrganizationUnit.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/OrganizationUnit.cs index 3d1bbb0531..981a0f8fae 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/OrganizationUnit.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/OrganizationUnit.cs @@ -23,16 +23,16 @@ namespace Volo.Abp.Identity /// /// Hierarchical Code of this organization unit. /// Example: "00001.00042.00005". - /// This is a unique code for a Tenant. + /// This is a unique code for an OrganizationUnit. /// It's changeable if OU hierarchy is changed. /// public virtual string Code { get; internal set; } /// - /// Display name of this role. + /// Display name of this OrganizationUnit. /// - public virtual string DisplayName { get; set; } - + public virtual string DisplayName { get; set; } + /// /// Roles of this OU. /// @@ -77,7 +77,7 @@ namespace Volo.Abp.Identity } /// - /// Appends a child code to a parent code. + /// Appends a child code to a parent code. /// Example: if parentCode = "00001", childCode = "00042" then returns "00001.00042". /// /// Parent code. Can be null or empty if parent is a root. diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs index 7bdb7d6837..d50745ab1d 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs @@ -12,7 +12,7 @@ namespace Volo.Abp.Identity.EntityFrameworkCore { public class EfCoreOrganizationUnitRepository : EfCoreRepository, - IOrganizationUnitRepository + IOrganizationUnitRepository { public EfCoreOrganizationUnitRepository( IDbContextProvider dbContextProvider) @@ -56,6 +56,7 @@ namespace Volo.Abp.Identity.EntityFrameworkCore .PageBy(skipCount, maxResultCount) .ToListAsync(GetCancellationToken(cancellationToken)); } + public virtual async Task> GetListAsync( IEnumerable ids, bool includeDetails = false, @@ -111,6 +112,23 @@ namespace Volo.Abp.Identity.EntityFrameworkCore return await query.CountAsync(GetCancellationToken(cancellationToken)); } + public virtual async Task> GetUnaddedRolesAsync( + OrganizationUnit organizationUnit, + string filter = null, + string sorting = null, + bool includeDetails = false, + CancellationToken cancellationToken = default) + { + var roleIds = organizationUnit.Roles.Select(r => r.RoleId).ToList(); + + return await DbContext.Roles + .Where(r => !roleIds.Contains(r.Id)) + .IncludeDetails(includeDetails) + .WhereIf(!filter.IsNullOrWhiteSpace(), r => r.Name.Contains(filter)) + .OrderBy(sorting ?? nameof(IdentityRole.Name)) + .ToListAsync(cancellationToken); + } + public virtual async Task> GetMembersAsync( OrganizationUnit organizationUnit, string sorting = null, @@ -118,8 +136,7 @@ namespace Volo.Abp.Identity.EntityFrameworkCore int skipCount = 0, string filter = null, bool includeDetails = false, - CancellationToken cancellationToken = default - ) + CancellationToken cancellationToken = default) { var query = CreateGetMembersFilteredQuery(organizationUnit, filter); @@ -138,6 +155,35 @@ namespace Volo.Abp.Identity.EntityFrameworkCore return await query.CountAsync(GetCancellationToken(cancellationToken)); } + public virtual async Task> GetUnaddedUsersAsync( + OrganizationUnit organizationUnit, + string filter = null, + string sorting = null, + bool includeDetails = false, + CancellationToken cancellationToken = default) + { + var userIdsInOrganizationUnit = DbContext.Set() + .Where(uou => uou.OrganizationUnitId == organizationUnit.Id) + .Select(uou => uou.UserId); + + var query = DbContext.Users + .Where(u => !userIdsInOrganizationUnit.Contains(u.Id)); + + if (!filter.IsNullOrWhiteSpace()) + { + query = query.Where(u => + u.UserName.Contains(filter) || + u.Email.Contains(filter) || + (u.PhoneNumber != null && u.PhoneNumber.Contains(filter)) + ); + } + + return await query + .IncludeDetails(includeDetails) + .OrderBy(sorting ?? nameof(IdentityUser.Name)) + .ToListAsync(cancellationToken); + } + public override IQueryable WithDetails() { return GetQueryable().IncludeDetails(); diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoOrganizationUnitRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoOrganizationUnitRepository.cs index 8c163d4126..2823c99a6c 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoOrganizationUnitRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoOrganizationUnitRepository.cs @@ -107,6 +107,22 @@ namespace Volo.Abp.Identity.MongoDB .CountAsync(cancellationToken); } + public async Task> GetUnaddedRolesAsync( + OrganizationUnit organizationUnit, + string filter = null, + string sorting = null, + bool includeDetails = false, + CancellationToken cancellationToken = default) + { + var roleIds = organizationUnit.Roles.Select(r => r.RoleId).ToArray(); + return await DbContext.Roles.AsQueryable() + .Where(r => !roleIds.Contains(r.Id)) + .WhereIf(!filter.IsNullOrWhiteSpace(), r => r.Name.Contains(filter)) + .OrderBy(sorting ?? nameof(IdentityRole.Name)) + .As>() + .ToListAsync(cancellationToken); + } + public virtual async Task> GetMembersAsync( OrganizationUnit organizationUnit, string sorting = null, @@ -135,6 +151,27 @@ namespace Volo.Abp.Identity.MongoDB return await query.CountAsync(GetCancellationToken(cancellationToken)); } + public async Task> GetUnaddedUsersAsync( + OrganizationUnit organizationUnit, + string filter = null, + string sorting = null, + bool includeDetails = false, + CancellationToken cancellationToken = default) + { + return await DbContext.Users.AsQueryable() + .Where(u => !u.OrganizationUnits.Any(uou => uou.OrganizationUnitId == organizationUnit.Id)) + .WhereIf>( + !filter.IsNullOrWhiteSpace(), + u => + u.UserName.Contains(filter) || + u.Email.Contains(filter) || + (u.PhoneNumber != null && u.PhoneNumber.Contains(filter)) + ) + .OrderBy(sorting ?? nameof(IdentityUser.UserName)) + .As>() + .ToListAsync(GetCancellationToken(cancellationToken)); + } + public virtual Task RemoveAllRolesAsync(OrganizationUnit organizationUnit, CancellationToken cancellationToken = default) { organizationUnit.Roles.Clear(); diff --git a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/OrganizationUnitRepository_Tests.cs b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/OrganizationUnitRepository_Tests.cs index bb8300d449..97544cd1e9 100644 --- a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/OrganizationUnitRepository_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/OrganizationUnitRepository_Tests.cs @@ -284,5 +284,26 @@ namespace Volo.Abp.Identity await uow.CompleteAsync(); } } + + [Fact] + public async Task GetUnaddedUsersOfOrganizationUnitAsync() + { + var ou = await _organizationUnitRepository.GetAsync("OU111", true); + var unaddedUsers = await _organizationUnitRepository.GetUnaddedUsersAsync(ou); + + unaddedUsers.ShouldNotContain(u => u.UserName == "john.nash"); + unaddedUsers.ShouldContain(u => u.UserName == "administrator"); + } + + [Fact] + public async Task GetUnaddedRolesOfOrganizationUnitAsync() + { + var ou = await _organizationUnitRepository.GetAsync("OU111", true); + var unaddedRoles = await _organizationUnitRepository.GetUnaddedRolesAsync(ou); + + unaddedRoles.ShouldNotContain(u => u.Name == "manager"); + unaddedRoles.ShouldNotContain(u => u.Name == "moderator"); + unaddedRoles.ShouldContain(u => u.Name.Contains("admin")); + } } } From e397b343a0b7dbaa6a1cb0b11c467190a4e132f6 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 7 Sep 2020 12:41:16 +0300 Subject: [PATCH 068/116] ci: separate cache actions --- .github/workflows/angular.yml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/angular.yml b/.github/workflows/angular.yml index 3a6d486144..dfca28338b 100644 --- a/.github/workflows/angular.yml +++ b/.github/workflows/angular.yml @@ -12,10 +12,13 @@ jobs: - uses: actions/cache@v2 with: - path: | - npm/ng-packs/node_modules - templates/app/angular/node_modules - key: ${{ runner.os }}-${{ hashFiles('**/yarn.lock') }} + path: 'npm/ng-packs/node_modules' + key: ${{ runner.os }}-${{ hashFiles('npm/ng-packs/yarn.lock') }} + + - uses: actions/cache@v2 + with: + path: 'templates/app/angular/node_modules' + key: ${{ runner.os }}-${{ hashFiles('templates/app/angular/yarn.lock') }} - name: Install packages run: yarn install From b295a3a3844b8f684828f2a0be4c8fc15c54df10 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Mon, 7 Sep 2020 13:18:47 +0300 Subject: [PATCH 070/116] pull/5300 Refactor & Unit tests --- .../Abp/Http/Client/AbpRemoteCallException.cs | 2 +- .../Volo.Abp.Http.Client.Tests.csproj | 4 ++++ .../Volo/Abp/Http/AbpHttpClientTestModule.cs | 22 +++++++++++++++++++ .../DynamicProxying/IRegularTestController.cs | 2 ++ .../DynamicProxying/RegularTestController.cs | 10 ++++++++- .../RegularTestControllerClientProxy_Tests.cs | 11 +++++++++- .../Localization/HttpClientTestResource.cs | 10 +++++++++ .../Volo/Abp/Http/Localization/en.json | 6 +++++ .../Identity/AbpIdentityResultException.cs | 13 ++++++++--- 9 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/Localization/HttpClientTestResource.cs create mode 100644 framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/Localization/en.json diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpRemoteCallException.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpRemoteCallException.cs index 71966868f9..19ecfba0ab 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpRemoteCallException.cs +++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpRemoteCallException.cs @@ -29,7 +29,7 @@ namespace Volo.Abp.Http.Client { Error = error; - if (error?.Data != null) + if (error.Data != null) { foreach (var dataKey in error.Data.Keys) { diff --git a/framework/test/Volo.Abp.Http.Client.Tests/Volo.Abp.Http.Client.Tests.csproj b/framework/test/Volo.Abp.Http.Client.Tests/Volo.Abp.Http.Client.Tests.csproj index 07708ce189..6b4e1ce4f0 100644 --- a/framework/test/Volo.Abp.Http.Client.Tests/Volo.Abp.Http.Client.Tests.csproj +++ b/framework/test/Volo.Abp.Http.Client.Tests/Volo.Abp.Http.Client.Tests.csproj @@ -14,4 +14,8 @@ + + + + diff --git a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/AbpHttpClientTestModule.cs b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/AbpHttpClientTestModule.cs index 9b2a28ad3e..6a18b06620 100644 --- a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/AbpHttpClientTestModule.cs +++ b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/AbpHttpClientTestModule.cs @@ -2,8 +2,12 @@ using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.Http.Client; using Volo.Abp.Http.DynamicProxying; +using Volo.Abp.Http.Localization; +using Volo.Abp.Localization; +using Volo.Abp.Localization.ExceptionHandling; using Volo.Abp.Modularity; using Volo.Abp.TestApp; +using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.Http { @@ -22,6 +26,24 @@ namespace Volo.Abp.Http { options.RemoteServices.Default = new RemoteServiceConfiguration("/"); }); + + + Configure(options => + { + options.FileSets.AddEmbedded(); + }); + + Configure(options => + { + options.Resources + .Add("en") + .AddVirtualJson("/Volo/Abp/Http/Localization"); + }); + + Configure(options => + { + options.MapCodeNamespace("Volo.Abp.Http.DynamicProxying", typeof(HttpClientTestResource)); + }); } } } diff --git a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/IRegularTestController.cs b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/IRegularTestController.cs index 546968d402..23694e4e72 100644 --- a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/IRegularTestController.cs +++ b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/IRegularTestController.cs @@ -9,6 +9,8 @@ namespace Volo.Abp.Http.DynamicProxying Task GetException1Async(); + Task GetException2Async(); + Task GetWithDateTimeParameterAsync(DateTime dateTime1); Task PostValueWithHeaderAndQueryStringAsync(string headerValue, string qsValue); diff --git a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestController.cs b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestController.cs index ef2a8bface..da61333d4e 100644 --- a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestController.cs +++ b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestController.cs @@ -27,6 +27,14 @@ namespace Volo.Abp.Http.DynamicProxying throw new UserFriendlyException("This is an error message!"); } + [HttpGet] + [Route("get-exception2")] + public Task GetException2Async() + { + throw new BusinessException("Volo.Abp.Http.DynamicProxying:10001") + .WithData("0","TEST"); + } + [HttpGet] [Route("get-with-datetime-parameter")] public Task GetWithDateTimeParameterAsync(DateTime dateTime1) @@ -133,4 +141,4 @@ namespace Volo.Abp.Http.DynamicProxying [FromQuery] public DateTime FirstReleaseDate { get; set; } } -} \ No newline at end of file +} diff --git a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestControllerClientProxy_Tests.cs b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestControllerClientProxy_Tests.cs index 85825263bd..2ac327e5e7 100644 --- a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestControllerClientProxy_Tests.cs +++ b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/DynamicProxying/RegularTestControllerClientProxy_Tests.cs @@ -1,8 +1,10 @@ using System; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Localization; using Shouldly; using Volo.Abp.Http.Client; +using Volo.Abp.Http.Localization; using Volo.Abp.Localization; using Xunit; @@ -32,6 +34,13 @@ namespace Volo.Abp.Http.DynamicProxying exception.Error.Message.ShouldBe("This is an error message!"); } + [Fact] + public async Task GetException2Async() + { + var exception = await Assert.ThrowsAsync(async () => await _controller.GetException2Async()); + exception.Error.Message.ShouldBe("Business exception with data: TEST"); + } + [Fact] public async Task GetWithDateTimeParameterAsync() { @@ -151,4 +160,4 @@ namespace Volo.Abp.Http.DynamicProxying } } -} \ No newline at end of file +} diff --git a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/Localization/HttpClientTestResource.cs b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/Localization/HttpClientTestResource.cs new file mode 100644 index 0000000000..fc87525b87 --- /dev/null +++ b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/Localization/HttpClientTestResource.cs @@ -0,0 +1,10 @@ +using Volo.Abp.Localization; + +namespace Volo.Abp.Http.Localization +{ + [LocalizationResourceName("HttpClientTest")] + public class HttpClientTestResource + { + + } +} diff --git a/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/Localization/en.json b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/Localization/en.json new file mode 100644 index 0000000000..9c88edf323 --- /dev/null +++ b/framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/Localization/en.json @@ -0,0 +1,6 @@ +{ + "culture": "en", + "texts": { + "Volo.Abp.Http.DynamicProxying:10001": "Business exception with data: {0}" + } +} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityResultException.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityResultException.cs index b608720576..05ea00bc58 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityResultException.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityResultException.cs @@ -32,14 +32,21 @@ namespace Volo.Abp.Identity public virtual string LocalizeMessage(LocalizationContext context) { - var values = IdentityResult.GetValuesFromErrorMessage(context.LocalizerFactory.Create()); + var localizer = context.LocalizerFactory.Create(); + + SetData(localizer); + + return IdentityResult.LocalizeErrors(localizer); + } + + protected virtual void SetData(IStringLocalizer localizer) + { + var values = IdentityResult.GetValuesFromErrorMessage(localizer); for (var index = 0; index < values.Length; index++) { Data[index.ToString()] = values[index]; } - - return IdentityResult.LocalizeErrors(context.LocalizerFactory.Create()); } } } From 3100284024bd48b137a38f54a40eb6f5dffd01be Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 7 Sep 2020 13:36:19 +0300 Subject: [PATCH 071/116] feat: add role labes to the name column of roles datatable --- .../src/lib/components/roles/roles.component.html | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.html b/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.html index 802e272dce..85986e20bb 100644 --- a/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.html +++ b/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.html @@ -63,10 +63,17 @@ - + + + {{ row.name }} + {{ + 'AbpIdentity::DisplayName:IsDefault' | abpLocalization + }} + {{ + 'AbpIdentity::DisplayName:IsPublic' | abpLocalization + }} + + From 61b0bd6e7e5313fb888f0dd45fda60ee654842cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87otur?= Date: Mon, 7 Sep 2020 15:30:31 +0300 Subject: [PATCH 072/116] AbpComponentDemoSectionTagHelper updated --- .../AbpComponentDemoSectionTagHelper.cs | 82 ++++++++++++++----- .../wwwroot/libs/abp/luxon/abp.luxon.js | 46 +++++++++++ 2 files changed, 107 insertions(+), 21 deletions(-) create mode 100644 framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/wwwroot/libs/abp/luxon/abp.luxon.js diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Views/Components/Themes/Shared/TagHelpers/AbpComponentDemoSectionTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Views/Components/Themes/Shared/TagHelpers/AbpComponentDemoSectionTagHelper.cs index 5b3bd7791a..bace14b124 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Views/Components/Themes/Shared/TagHelpers/AbpComponentDemoSectionTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Views/Components/Themes/Shared/TagHelpers/AbpComponentDemoSectionTagHelper.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Razor.TagHelpers; using Microsoft.Extensions.FileProviders; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers; +using Volo.Abp.Guids; using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.Views.Components.Themes.Shared.TagHelpers @@ -17,10 +18,14 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.Views.Components.Themes.S public string Title { get; set; } private readonly IVirtualFileProvider _virtualFileProvider; + private readonly IGuidGenerator _guidGenerator; - public AbpComponentDemoSectionTagHelper(IVirtualFileProvider virtualFileProvider) + public AbpComponentDemoSectionTagHelper( + IVirtualFileProvider virtualFileProvider, + IGuidGenerator guidGenerator) { _virtualFileProvider = virtualFileProvider; + _guidGenerator = guidGenerator; } public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) @@ -29,34 +34,69 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.Views.Components.Themes.S var content = await output.GetChildContentAsync(); - output.PreContent.AppendHtml("
"); - output.PreContent.AppendHtml($"

{Title}

"); - output.PreContent.AppendHtml("
"); + var previewId = _guidGenerator.Create(); + var codeBlockId = _guidGenerator.Create(); + + var codeBlockTabId = _guidGenerator.Create(); + var tagHelperCodeBlockId = _guidGenerator.Create(); + var bootstrapCodeBlockId = _guidGenerator.Create(); + + output.PreContent.AppendHtml("
"); + output.PreContent.AppendHtml("
"); + output.PreContent.AppendHtml(""); // row + output.PreContent.AppendHtml("
"); // card-header + output.PreContent.AppendHtml("
"); + output.PreContent.AppendHtml($"
"); + output.PreContent.AppendHtml($"
"); + /* component rendering here */ - output.PostContent.AppendHtml("
"); //abp-component-demo-section-body - AppendRawSource(output); - AppendBootstrapSource(output, content); - output.PostContent.AppendHtml("
"); //abp-component-demo-section - } - private static void AppendBootstrapSource(TagHelperOutput output, TagHelperContent content) - { - output.PostContent.AppendHtml("
"); - output.PostContent.AppendHtml("

Bootstrap

"); + output.PostContent.AppendHtml("
"); // tab-pane + output.PostContent.AppendHtml($"
"); + + /* CodeBlock tabs */ + + output.PostContent.AppendHtml($"
    "); + output.PostContent.AppendHtml("
  • "); + output.PostContent.AppendHtml($"Abp Tag Helper"); + output.PostContent.AppendHtml("
  • "); + output.PostContent.AppendHtml("
  • "); + output.PostContent.AppendHtml($"Bootstrap Render"); + output.PostContent.AppendHtml("
  • "); + output.PostContent.AppendHtml("
"); + output.PostContent.AppendHtml($"
"); + + output.PostContent.AppendHtml($"
"); output.PostContent.AppendHtml("
");
-            output.PostContent.Append(content.GetContent());
+            output.PostContent.AppendHtml("");
+            output.PostContent.Append(GetRawDemoSource());
+            output.PostContent.AppendHtml("");
             output.PostContent.AppendHtml("
"); output.PostContent.AppendHtml("
"); - } - - private void AppendRawSource(TagHelperOutput output) - { - output.PostContent.AppendHtml("
"); - output.PostContent.AppendHtml("

ABP Tag Helpers

"); + + output.PostContent.AppendHtml($"
"); output.PostContent.AppendHtml("
");
-            output.PostContent.Append(GetRawDemoSource());
+            output.PostContent.AppendHtml("");
+            output.PostContent.Append(content.GetContent());
+            output.PostContent.AppendHtml("");
             output.PostContent.AppendHtml("
"); output.PostContent.AppendHtml("
"); + + output.PostContent.AppendHtml("
"); // tab-content + output.PostContent.AppendHtml("
"); // tab-pane + output.PostContent.AppendHtml("
"); // tab-content + output.PostContent.AppendHtml("
"); // card-body + output.PostContent.AppendHtml("
"); // card } private string GetRawDemoSource() diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/wwwroot/libs/abp/luxon/abp.luxon.js b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/wwwroot/libs/abp/luxon/abp.luxon.js new file mode 100644 index 0000000000..b04de7cadf --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/wwwroot/libs/abp/luxon/abp.luxon.js @@ -0,0 +1,46 @@ +var abp = abp || {}; +(function () { + + if (!luxon) { + throw "abp/luxon library requires the luxon library included to the page!"; + } + + /* TIMING *************************************************/ + + abp.timing = abp.timing || {}; + + var setObjectValue = function (obj, property, value) { + if (typeof property === "string") { + property = property.split('.'); + } + + if (property.length > 1) { + var p = property.shift(); + setObjectValue(obj[p], property, value); + } else { + obj[property[0]] = value; + } + } + + var getObjectValue = function (obj, property) { + return property.split('.').reduce((a, v) => a[v], obj) + } + + abp.timing.convertFieldsToIsoDate = function (form, fields) { + for (var field of fields) { + var dateTime = luxon.DateTime + .fromFormat( + getObjectValue(form, field), + abp.localization.currentCulture.dateTimeFormat.shortDatePattern, + {locale: abp.localization.currentCulture.cultureName} + ); + + if (!dateTime.invalid) { + setObjectValue(form, field, dateTime.toFormat("yyyy-MM-dd HH:mm:ss")) + } + } + + return form; + } + +})(jQuery); From fdc9b682d067679531b0c5af1060844700edcc53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87otur?= Date: Mon, 7 Sep 2020 15:36:50 +0300 Subject: [PATCH 073/116] Update AbpComponentDemoSectionTagHelper.cs --- .../Shared/TagHelpers/AbpComponentDemoSectionTagHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Views/Components/Themes/Shared/TagHelpers/AbpComponentDemoSectionTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Views/Components/Themes/Shared/TagHelpers/AbpComponentDemoSectionTagHelper.cs index bace14b124..722460992d 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Views/Components/Themes/Shared/TagHelpers/AbpComponentDemoSectionTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Views/Components/Themes/Shared/TagHelpers/AbpComponentDemoSectionTagHelper.cs @@ -71,7 +71,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.Views.Components.Themes.S output.PostContent.AppendHtml($"Abp Tag Helper"); output.PostContent.AppendHtml(""); output.PostContent.AppendHtml("
  • "); - output.PostContent.AppendHtml($"Bootstrap Render"); + output.PostContent.AppendHtml($"Bootstrap"); output.PostContent.AppendHtml("
  • "); output.PostContent.AppendHtml(""); output.PostContent.AppendHtml($"
    "); From 165b7c20ef65b338751345cda531d8e503eb12f0 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Mon, 7 Sep 2020 15:47:45 +0300 Subject: [PATCH 074/116] abp.io localization update --- .../AbpIoLocalization/Base/Localization/Resources/en.json | 1 + .../AbpIoLocalization/Community/Localization/Resources/en.json | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json index a6ee47e253..d6f334f7cd 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json @@ -26,6 +26,7 @@ "ContributionGuide": "Contribution Guide", "Blog": "Blog", "Commercial": "Commercial", + "MyAccount": "My account", "SeeDocuments": "See Documents" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json index c74a26689f..286346a5b5 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json @@ -78,7 +78,6 @@ "Biography": "Biography", "HasNoPublishedArticlesYet": "has no published articles yet", "Author": "Author", - "MyAccount": "My account", "LatestGithubAnnouncements": "Latest Github Announcements", "SeeAllAnnouncements": "See All Announcements", "LatestBlogPost": "Latest Blog Post", From c6c56e316ff5f993bec15ea1e72b9a3f59bbeaf7 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Mon, 7 Sep 2020 16:48:07 +0300 Subject: [PATCH 075/116] identity module localizations & exceptions refactor --- .../Volo/Abp/Identity/Localization/ar.json | 56 ++++++------ .../Volo/Abp/Identity/Localization/cs.json | 58 ++++++------ .../Volo/Abp/Identity/Localization/de.json | 56 ++++++------ .../Volo/Abp/Identity/Localization/en.json | 14 +-- .../Volo/Abp/Identity/Localization/nl.json | 56 ++++++------ .../Volo/Abp/Identity/Localization/pl-PL.json | 58 ++++++------ .../Volo/Abp/Identity/Localization/pt-BR.json | 60 ++++++------- .../Volo/Abp/Identity/Localization/ru.json | 56 ++++++------ .../Volo/Abp/Identity/Localization/sl.json | 56 ++++++------ .../Volo/Abp/Identity/Localization/tr.json | 11 +-- .../Volo/Abp/Identity/Localization/vi.json | 56 ++++++------ .../Abp/Identity/Localization/zh-Hans.json | 61 +++++++------ .../Abp/Identity/Localization/zh-Hant.json | 89 +++++++------------ .../Volo/Abp/Identity/IdentityRoleManager.cs | 12 +-- .../Abp/Identity/OrganizationUnitManager.cs | 3 +- 15 files changed, 337 insertions(+), 365 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json index 41ac73c1b3..906f2a98f6 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json @@ -35,34 +35,34 @@ "DisplayName:NewPasswordConfirm": "تأكيد كلمة المرور الجديدة", "PasswordChangedMessage": "تم تغيير كلمة مرورك بنجاح.", "PersonalSettingsSavedMessage": "تم حفظ إعداداتك الشخصية بنجاح.", - "Identity.DefaultError": "حدث خطأ.", - "Identity.ConcurrencyFailure": "فشل التزامن المتفائل ، تم تعديل الكائن.", - "Identity.DuplicateEmail": "البريد الإلكتروني '{0}' مستخدم بالفعل.", - "Identity.DuplicateRoleName": "اسم الدور '{0}' مأخوذ بالفعل.", - "Identity.DuplicateUserName": "اسم المستخدم '{0}' مأخوذ بالفعل.", - "Identity.InvalidEmail": "البريد الإلكتروني '{0}' غير صالح.", - "Identity.InvalidPasswordHasherCompatibilityMode": "وضع PasswordHasherCompatibilityMode غير صالح.", - "Identity.InvalidPasswordHasherIterationCount": "يجب أن يكون عدد التكرار عددًا صحيحًا موجبًا.", - "Identity.InvalidRoleName": "اسم الدور '{0}' غير صالح.", - "Identity.InvalidToken": "غير صالح token.", - "Identity.InvalidUserName": "اسم المستخدم '{0}' غير صالح ، يمكن أن يحتوي على أحرف أو أرقام فقط.", - "Identity.LoginAlreadyAssociated": "يوجد مستخدم لديه معلومات تسجيل الدخول هذه بالفعل.", - "Identity.PasswordMismatch": "كلمة مرور غير صحيحة.", - "Identity.PasswordRequiresDigit": "يجب أن تحتوي كلمات المرور على رقم واحد على الأقل ('0' - '9').", - "Identity.PasswordRequiresLower": "يجب أن تحتوي كلمات المرور على حرف صغير واحد على الأقل ('a' - 'z').", - "Identity.PasswordRequiresNonAlphanumeric": "يجب أن تحتوي كلمات المرور على حرف واحد غير أبجدي رقمي على الأقل.", - "Identity.PasswordRequiresUpper": "يجب أن تحتوي كلمات المرور على حرف كبير واحد على الأقل ('A' - 'Z').", - "Identity.PasswordTooShort": "يجب أن تتكون كلمات المرور من {0} حرف على الأقل.", - "Identity.RoleNotFound": "الدور {0} غير موجود.", - "Identity.UserAlreadyHasPassword": "لدى المستخدم بالفعل مجموعة كلمات مرور.", - "Identity.UserAlreadyInRole": "المستخدم بالفعل في الدور '{0}'.", - "Identity.UserLockedOut": "المستخدم مغلق.", - "Identity.UserLockoutNotEnabled": "التأمين غير ممكّن لهذا المستخدم.", - "Identity.UserNameNotFound": "المستخدم {0} غير موجود.", - "Identity.UserNotInRole": "المستخدم ليس في الدور '{0}'.", - "Identity.PasswordConfirmationFailed": "كلمة المرور لا تتطابق مع كلمة مرور التأكيد.", - "Identity.StaticRoleRenamingErrorMessage": "لا يمكن إعادة تسمية الأدوار الثابتة.", - "Identity.StaticRoleDeletionErrorMessage": "لا يمكن حذف الأدوار الثابتة.", + "Volo.Abp.Identity:DefaultError": "حدث خطأ.", + "Volo.Abp.Identity:ConcurrencyFailure": "فشل التزامن المتفائل ، تم تعديل الكائن.", + "Volo.Abp.Identity:DuplicateEmail": "البريد الإلكتروني '{0}' مستخدم بالفعل.", + "Volo.Abp.Identity:DuplicateRoleName": "اسم الدور '{0}' مأخوذ بالفعل.", + "Volo.Abp.Identity:DuplicateUserName": "اسم المستخدم '{0}' مأخوذ بالفعل.", + "Volo.Abp.Identity:InvalidEmail": "البريد الإلكتروني '{0}' غير صالح.", + "Volo.Abp.Identity:InvalidPasswordHasherCompatibilityMode": "وضع PasswordHasherCompatibilityMode غير صالح.", + "Volo.Abp.Identity:InvalidPasswordHasherIterationCount": "يجب أن يكون عدد التكرار عددًا صحيحًا موجبًا.", + "Volo.Abp.Identity:InvalidRoleName": "اسم الدور '{0}' غير صالح.", + "Volo.Abp.Identity:InvalidToken": "غير صالح token.", + "Volo.Abp.Identity:InvalidUserName": "اسم المستخدم '{0}' غير صالح ، يمكن أن يحتوي على أحرف أو أرقام فقط.", + "Volo.Abp.Identity:LoginAlreadyAssociated": "يوجد مستخدم لديه معلومات تسجيل الدخول هذه بالفعل.", + "Volo.Abp.Identity:PasswordMismatch": "كلمة مرور غير صحيحة.", + "Volo.Abp.Identity:PasswordRequiresDigit": "يجب أن تحتوي كلمات المرور على رقم واحد على الأقل ('0' - '9').", + "Volo.Abp.Identity:PasswordRequiresLower": "يجب أن تحتوي كلمات المرور على حرف صغير واحد على الأقل ('a' - 'z').", + "Volo.Abp.Identity:PasswordRequiresNonAlphanumeric": "يجب أن تحتوي كلمات المرور على حرف واحد غير أبجدي رقمي على الأقل.", + "Volo.Abp.Identity:PasswordRequiresUpper": "يجب أن تحتوي كلمات المرور على حرف كبير واحد على الأقل ('A' - 'Z').", + "Volo.Abp.Identity:PasswordTooShort": "يجب أن تتكون كلمات المرور من {0} حرف على الأقل.", + "Volo.Abp.Identity:RoleNotFound": "الدور {0} غير موجود.", + "Volo.Abp.Identity:UserAlreadyHasPassword": "لدى المستخدم بالفعل مجموعة كلمات مرور.", + "Volo.Abp.Identity:UserAlreadyInRole": "المستخدم بالفعل في الدور '{0}'.", + "Volo.Abp.Identity:UserLockedOut": "المستخدم مغلق.", + "Volo.Abp.Identity:UserLockoutNotEnabled": "التأمين غير ممكّن لهذا المستخدم.", + "Volo.Abp.Identity:UserNameNotFound": "المستخدم {0} غير موجود.", + "Volo.Abp.Identity:UserNotInRole": "المستخدم ليس في الدور '{0}'.", + "Volo.Abp.Identity:PasswordConfirmationFailed": "كلمة المرور لا تتطابق مع كلمة مرور التأكيد.", + "Volo.Abp.Identity:010005": "لا يمكن إعادة تسمية الأدوار الثابتة.", + "Volo.Abp.Identity:010006": "لا يمكن حذف الأدوار الثابتة.", "Volo.Abp.Identity:010001": "لا يمكنك حذف حسابك الخاص!", "Permission:IdentityManagement": "إدارة الهوية", "Permission:RoleManagement": "إدارة الأدوار", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json index 04c85027a6..fde498c996 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json @@ -35,35 +35,35 @@ "DisplayName:NewPasswordConfirm": "Potvrzení nového hesla", "PasswordChangedMessage": "Vaše heslo bylo úspěšně změněno.", "PersonalSettingsSavedMessage": "Vaše osobní nastavení bylo úspěšně uloženo.", - "Identity.DefaultError": "Došlo k neznámé chybě.", - "Identity.ConcurrencyFailure": "Selhání optimistické souběžnosti, objekt byl změněn.", - "Identity.DuplicateEmail": "Email '{0}' již existuje.", - "Identity.DuplicateRoleName": "Role '{0}' již existuje.", - "Identity.DuplicateUserName": "Uživatelské jméno '{0}' již existuje.", - "Identity.InvalidEmail": "Email '{0}' je neplatný.", - "Identity.InvalidPasswordHasherCompatibilityMode": "Dodaný PasswordHasherCompatibilityMode je neplatný.", - "Identity.InvalidPasswordHasherIterationCount": "Počet iterací musí být kladné celé číslo.", - "Identity.InvalidRoleName": "Role '{0}' je neplatná.", - "Identity.InvalidToken": "Neplatný token.", - "Identity.InvalidUserName": "Uživatelské jméno '{0}' je neplatné, může obsahovat pouze písmena a číslice.", - "Identity.LoginAlreadyAssociated": "Uživatel s tímto přihlášením již existuje.", - "Identity.PasswordMismatch": "Chybné heslo.", - "Identity.PasswordRequiresDigit": "Hesla musí obsahovat alespoň jednu číslici ('0'-'9').", - "Identity.PasswordRequiresLower": "Hesla musí obsahovat alespoň jedno malé písmeno ('a'-'z').", - "Identity.PasswordRequiresNonAlphanumeric": "Hesla musí obsahovat alespoň jeden nealfanumerický znak.", - "Identity.PasswordRequiresUpper": "Hesla musí obsahovat alespoň jedno velké písmeno ('A'-'Z').", - "Identity.PasswordTooShort": "Hesla musí být dlouhá alespoň {0} znaků.", - "Identity.RoleNotFound": "Role {0} neexistuje.", - "Identity.UserAlreadyHasPassword": "Uživatel již má nastavené heslo.", - "Identity.UserAlreadyInRole": "Uživatel již je v roli '{0}'.", - "Identity.UserLockedOut": "Uživatel je uzamčen.", - "Identity.UserLockoutNotEnabled": "Uzamčení není umožněno pro tohoto uživatele.", - "Identity.UserNameNotFound": "Uživatel {0} neexistuje.", - "Identity.UserNotInRole": "Uživatel není v roli '{0}'.", - "Identity.PasswordConfirmationFailed": "Heslo nesouhlasí s potvrzovacím heslem.", - "Identity.StaticRoleRenamingErrorMessage": "Statické role nemohou být přejmenovány.", - "Identity.StaticRoleDeletionErrorMessage": "Statické role nemohou být smazány.", - "Identity.OrganizationUnit.DuplicateDisplayNameWarning": "Organizační jednotka s názvem {0} již existuje. Na stejné úrovni nelze vytvořit více jednotek se stejným názvem.", + "Volo.Abp.Identity:DefaultError": "Došlo k neznámé chybě.", + "Volo.Abp.Identity:ConcurrencyFailure": "Selhání optimistické souběžnosti, objekt byl změněn.", + "Volo.Abp.Identity:DuplicateEmail": "Email '{0}' již existuje.", + "Volo.Abp.Identity:DuplicateRoleName": "Role '{0}' již existuje.", + "Volo.Abp.Identity:DuplicateUserName": "Uživatelské jméno '{0}' již existuje.", + "Volo.Abp.Identity:InvalidEmail": "Email '{0}' je neplatný.", + "Volo.Abp.Identity:InvalidPasswordHasherCompatibilityMode": "Dodaný PasswordHasherCompatibilityMode je neplatný.", + "Volo.Abp.Identity:InvalidPasswordHasherIterationCount": "Počet iterací musí být kladné celé číslo.", + "Volo.Abp.Identity:InvalidRoleName": "Role '{0}' je neplatná.", + "Volo.Abp.Identity:InvalidToken": "Neplatný token.", + "Volo.Abp.Identity:InvalidUserName": "Uživatelské jméno '{0}' je neplatné, může obsahovat pouze písmena a číslice.", + "Volo.Abp.Identity:LoginAlreadyAssociated": "Uživatel s tímto přihlášením již existuje.", + "Volo.Abp.Identity:PasswordMismatch": "Chybné heslo.", + "Volo.Abp.Identity:PasswordRequiresDigit": "Hesla musí obsahovat alespoň jednu číslici ('0'-'9').", + "Volo.Abp.Identity:PasswordRequiresLower": "Hesla musí obsahovat alespoň jedno malé písmeno ('a'-'z').", + "Volo.Abp.Identity:PasswordRequiresNonAlphanumeric": "Hesla musí obsahovat alespoň jeden nealfanumerický znak.", + "Volo.Abp.Identity:PasswordRequiresUpper": "Hesla musí obsahovat alespoň jedno velké písmeno ('A'-'Z').", + "Volo.Abp.Identity:PasswordTooShort": "Hesla musí být dlouhá alespoň {0} znaků.", + "Volo.Abp.Identity:RoleNotFound": "Role {0} neexistuje.", + "Volo.Abp.Identity:UserAlreadyHasPassword": "Uživatel již má nastavené heslo.", + "Volo.Abp.Identity:UserAlreadyInRole": "Uživatel již je v roli '{0}'.", + "Volo.Abp.Identity:UserLockedOut": "Uživatel je uzamčen.", + "Volo.Abp.Identity:UserLockoutNotEnabled": "Uzamčení není umožněno pro tohoto uživatele.", + "Volo.Abp.Identity:UserNameNotFound": "Uživatel {0} neexistuje.", + "Volo.Abp.Identity:UserNotInRole": "Uživatel není v roli '{0}'.", + "Volo.Abp.Identity:PasswordConfirmationFailed": "Heslo nesouhlasí s potvrzovacím heslem.", + "Volo.Abp.Identity:010005": "Statické role nemohou být přejmenovány.", + "Volo.Abp.Identity:010006": "Statické role nemohou být smazány.", + "Volo.Abp.Identity:010004": "Organizační jednotka s názvem {0} již existuje. Na stejné úrovni nelze vytvořit více jednotek se stejným názvem.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Maximální povolený počet členů organizační jednotky pro uživatele", "Volo.Abp.Identity:010001": "Nemůžete smazat svůj vlastní účet!", "Permission:IdentityManagement": "Správa identit", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json index ccd2b60cfc..a8da0baae1 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json @@ -35,34 +35,34 @@ "DisplayName:NewPasswordConfirm": "Neues Passwort bestätigen", "PasswordChangedMessage": "Ihr Passwort wurde erfolgreich geändert.", "PersonalSettingsSavedMessage": "Ihre persönlichen Einstellungen wurden erfolgreich gespeichert.", - "Identity.DefaultError": "Ein unbekannter Fehler ist aufgetreten.", - "Identity.ConcurrencyFailure": "Optimistischer Nebenläufigkeitsfehler, Objekt wurde geändert.", - "Identity.DuplicateEmail": "E-Mail '{0}' ist bereits vergeben.", - "Identity.DuplicateRoleName": "Der Rollenname '{0}' ist bereits vergeben.", - "Identity.DuplicateUserName": "Der Benutzername '{0}' ist bereits vergeben.", - "Identity.InvalidEmail": "E-Mail '{0}' ist ungültig.", - "Identity.InvalidPasswordHasherCompatibilityMode": "Der angegebene PasswordHasherCompatibilityMode ist ungültig.", - "Identity.InvalidPasswordHasherIterationCount": "Die Iterationszahl muss eine positive Ganzzahl sein.", - "Identity.InvalidRoleName": "Der Rollenname '{0}' ist ungültig.", - "Identity.InvalidToken": "Ungültiges Token.", - "Identity.InvalidUserName": "Benutzername '{0}' ist ungültig, kann nur Buchstaben oder Ziffern enthalten.", - "Identity.LoginAlreadyAssociated": "Ein Benutzer mit diesem Login existiert bereits.", - "Identity.PasswordMismatch": "Falsches Passwort.", - "Identity.PasswordRequiresDigit": "Passwörter müssen mindestens eine Ziffer ('0'-'9') enthalten.", - "Identity.PasswordRequiresLower": "Passwörter müssen mindestens einen Kleinbuchstaben ('a'-'z') enthalten.", - "Identity.PasswordRequiresNonAlphanumeric": "Passwörter müssen mindestens ein Sonderzeichen enthalten.", - "Identity.PasswordRequiresUpper": "Passwörter müssen mindestens einen Großbuchstaben ('A'-'Z') enthalten.", - "Identity.PasswordTooShort": "Passwörter müssen mindestens {0} Zeichen enthalten.", - "Identity.RoleNotFound": "Die Rolle {0} existiert nicht.", - "Identity.UserAlreadyHasPassword": "Der Benutzer hat bereits ein Passwort gesetzt.", - "Identity.UserAlreadyInRole": "Benutzer ist bereits in der Rolle '{0}'.", - "Identity.UserLockedOut": "Benutzer ist ausgesperrt.", - "Identity.UserLockoutNotEnabled": "Aussperrung ist für diesen Benutzer nicht aktiviert.", - "Identity.UserNameNotFound": "Benutzer {0} existiert nicht.", - "Identity.UserNotInRole": "Benutzer ist nicht in der Rolle '{0}'.", - "Identity.PasswordConfirmationFailed": "Passwort stimmt nicht mit dem Bestätigungspasswort überein.", - "Identity.StaticRoleRenamingErrorMessage": "Statische Rollen können nicht umbenannt werden.", - "Identity.StaticRoleDeletionErrorMessage": "Statische Rollen können nicht gelöscht werden.", + "Volo.Abp.Identity:DefaultError": "Ein unbekannter Fehler ist aufgetreten.", + "Volo.Abp.Identity:ConcurrencyFailure": "Optimistischer Nebenläufigkeitsfehler, Objekt wurde geändert.", + "Volo.Abp.Identity:DuplicateEmail": "E-Mail '{0}' ist bereits vergeben.", + "Volo.Abp.Identity:DuplicateRoleName": "Der Rollenname '{0}' ist bereits vergeben.", + "Volo.Abp.Identity:DuplicateUserName": "Der Benutzername '{0}' ist bereits vergeben.", + "Volo.Abp.Identity:InvalidEmail": "E-Mail '{0}' ist ungültig.", + "Volo.Abp.Identity:InvalidPasswordHasherCompatibilityMode": "Der angegebene PasswordHasherCompatibilityMode ist ungültig.", + "Volo.Abp.Identity:InvalidPasswordHasherIterationCount": "Die Iterationszahl muss eine positive Ganzzahl sein.", + "Volo.Abp.Identity:InvalidRoleName": "Der Rollenname '{0}' ist ungültig.", + "Volo.Abp.Identity:InvalidToken": "Ungültiges Token.", + "Volo.Abp.Identity:InvalidUserName": "Benutzername '{0}' ist ungültig, kann nur Buchstaben oder Ziffern enthalten.", + "Volo.Abp.Identity:LoginAlreadyAssociated": "Ein Benutzer mit diesem Login existiert bereits.", + "Volo.Abp.Identity:PasswordMismatch": "Falsches Passwort.", + "Volo.Abp.Identity:PasswordRequiresDigit": "Passwörter müssen mindestens eine Ziffer ('0'-'9') enthalten.", + "Volo.Abp.Identity:PasswordRequiresLower": "Passwörter müssen mindestens einen Kleinbuchstaben ('a'-'z') enthalten.", + "Volo.Abp.Identity:PasswordRequiresNonAlphanumeric": "Passwörter müssen mindestens ein Sonderzeichen enthalten.", + "Volo.Abp.Identity:PasswordRequiresUpper": "Passwörter müssen mindestens einen Großbuchstaben ('A'-'Z') enthalten.", + "Volo.Abp.Identity:PasswordTooShort": "Passwörter müssen mindestens {0} Zeichen enthalten.", + "Volo.Abp.Identity:RoleNotFound": "Die Rolle {0} existiert nicht.", + "Volo.Abp.Identity:UserAlreadyHasPassword": "Der Benutzer hat bereits ein Passwort gesetzt.", + "Volo.Abp.Identity:UserAlreadyInRole": "Benutzer ist bereits in der Rolle '{0}'.", + "Volo.Abp.Identity:UserLockedOut": "Benutzer ist ausgesperrt.", + "Volo.Abp.Identity:UserLockoutNotEnabled": "Aussperrung ist für diesen Benutzer nicht aktiviert.", + "Volo.Abp.Identity:UserNameNotFound": "Benutzer {0} existiert nicht.", + "Volo.Abp.Identity:UserNotInRole": "Benutzer ist nicht in der Rolle '{0}'.", + "Volo.Abp.Identity:PasswordConfirmationFailed": "Passwort stimmt nicht mit dem Bestätigungspasswort überein.", + "Volo.Abp.Identity:010005": "Statische Rollen können nicht umbenannt werden.", + "Volo.Abp.Identity:010006": "Statische Rollen können nicht gelöscht werden.", "Volo.Abp.Identity:010001": "Sie können Ihr eigenes Konto nicht löschen!", "Permission:IdentityManagement": "Identitätsverwaltung", "Permission:RoleManagement": "Rollenverwaltung", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json index 8259e1abb2..9fe464ae96 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json @@ -61,11 +61,13 @@ "Volo.Abp.Identity:UserNameNotFound": "User {0} does not exist.", "Volo.Abp.Identity:UserNotInRole": "User is not in role '{0}'.", "Volo.Abp.Identity:PasswordConfirmationFailed": "Password does not match the confirm password.", - "Volo.Abp.Identity:StaticRoleRenamingErrorMessage": "Static roles can not be renamed.", - "Volo.Abp.Identity:StaticRoleDeletionErrorMessage": "Static roles can not be deleted.", - "Identity.OrganizationUnit.DuplicateDisplayNameWarning": "There is already an organization unit with name {0}. Two units with same name can not be created in same level.", - "Identity.OrganizationUnit.MaxUserMembershipCount": "Maximum allowed organization unit membership count for a user", "Volo.Abp.Identity:010001": "You can not delete your own account!", + "Volo.Abp.Identity:010002": "Can not set more than {MaxUserMembershipCount} organization unit for a user!", + "Volo.Abp.Identity:010003": "Can not change password of an externally logged in user!", + "Volo.Abp.Identity:010004": "There is already an organization unit with name {0}. Two units with same name can not be created in same level.", + "Volo.Abp.Identity:010005": "Static roles can not be renamed.", + "Volo.Abp.Identity:010006": "Static roles can not be deleted.", + "Identity.OrganizationUnit.MaxUserMembershipCount": "Maximum allowed organization unit membership count for a user", "Permission:IdentityManagement": "Identity management", "Permission:RoleManagement": "Role management", "Permission:Create": "Create", @@ -101,8 +103,6 @@ "Description:Abp.Identity.SignIn.EnablePhoneNumberConfirmation": "Whether the phoneNumber can be confirmed by the user.", "Description:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "Whether a confirmed telephone number is required to sign in.", "Description:Abp.Identity.User.IsUserNameUpdateEnabled": "Whether the username can be updated by the user.", - "Description:Abp.Identity.User.IsEmailUpdateEnabled": "Whether the email can be updated by the user.", - "Volo.Abp.Identity:010002": "Can not set more than {MaxUserMembershipCount} organization unit for a user!", - "Volo.Abp.Identity:010003": "Can not change password of an externally logged in user!" + "Description:Abp.Identity.User.IsEmailUpdateEnabled": "Whether the email can be updated by the user." } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json index 84ed47efce..1ca863e935 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json @@ -35,34 +35,34 @@ "DisplayName:NewPasswordConfirm": "Bevestig nieuw wachtwoord", "PasswordChangedMessage": "Uw wachtwoord is met succes veranderd.", "PersonalSettingsSavedMessage": "Uw persoonlijke instellingen zijn succesvol opgeslagen.", - "Identity.DefaultError": "Er is een onbekende fout opgetreden.", - "Identity.ConcurrencyFailure": "Optimistische gelijktijdigheidsfout, object is gewijzigd.", - "Identity.DuplicateEmail": "E-mail '{0}' is al in gebruik.", - "Identity.DuplicateRoleName": "De rolnaam '{0}' is al in gebruik.", - "Identity.DuplicateUserName": "Gebruikersnaam '{0}' is al in gebruik.", - "Identity.InvalidEmail": "E-mail' {0} 'is ongeldig.", - "Identity.InvalidPasswordHasherCompatibilityMode": "De opgegeven PasswordHasherCompatibilityMode is ongeldig.", - "Identity.InvalidPasswordHasherIterationCount": "De iteratietelling moet een positief geheel getal zijn.", - "Identity.InvalidRoleName": "Rolnaam '{0}' is ongeldig.", - "Identity.InvalidToken": "Ongeldig token.", - "Identity.InvalidUserName": "Gebruikersnaam '{0}' is ongeldig, mag alleen letters of cijfers bevatten.", - "Identity.LoginAlreadyAssociated": "Er bestaat al een gebruiker met deze login.", - "Identity.PasswordMismatch": "Incorrect wachtwoord.", - "Identity.PasswordRequiresDigit": "Wachtwoorden moeten minimaal één cijfer bevatten ('0' - '9').", - "Identity.PasswordRequiresLower": "Wachtwoorden moeten minstens één kleine letter bevatten ('a' - 'z').", - "Identity.PasswordRequiresNonAlphanumeric": "Wachtwoorden moeten minimaal één niet-alfanumeriek teken bevatten.", - "Identity.PasswordRequiresUpper": "Wachtwoorden moeten ten minste één hoofdletter bevatten ('A' - 'Z').", - "Identity.PasswordTooShort": "Wachtwoorden moeten uit minimaal {0} tekens bestaan.", - "Identity.RoleNotFound": "Rol {0} bestaat niet.", - "Identity.UserAlreadyHasPassword": "Gebruiker heeft al een wachtwoord ingesteld.", - "Identity.UserAlreadyInRole": "Gebruiker al in rol '{0}'.", - "Identity.UserLockedOut": "Gebruiker is geblokkeerd.", - "Identity.UserLockoutNotEnabled": "Lockout is niet ingeschakeld voor deze gebruiker.", - "Identity.UserNameNotFound": "Gebruiker {0} bestaat niet.", - "Identity.UserNotInRole": "Gebruiker speelt geen rol '{0}'.", - "Identity.PasswordConfirmationFailed": "Wachtwoord komt niet overeen met de wachtwoord bevestiging.", - "Identity.StaticRoleRenamingErrorMessage": "Statische rollen kunnen niet worden hernoemd.", - "Identity.StaticRoleDeletionErrorMessage": "Statische rollen kunnen niet worden verwijderd.", + "Volo.Abp.Identity:DefaultError": "Er is een onbekende fout opgetreden.", + "Volo.Abp.Identity:ConcurrencyFailure": "Optimistische gelijktijdigheidsfout, object is gewijzigd.", + "Volo.Abp.Identity:DuplicateEmail": "E-mail '{0}' is al in gebruik.", + "Volo.Abp.Identity:DuplicateRoleName": "De rolnaam '{0}' is al in gebruik.", + "Volo.Abp.Identity:DuplicateUserName": "Gebruikersnaam '{0}' is al in gebruik.", + "Volo.Abp.Identity:InvalidEmail": "E-mail' {0} 'is ongeldig.", + "Volo.Abp.Identity:InvalidPasswordHasherCompatibilityMode": "De opgegeven PasswordHasherCompatibilityMode is ongeldig.", + "Volo.Abp.Identity:InvalidPasswordHasherIterationCount": "De iteratietelling moet een positief geheel getal zijn.", + "Volo.Abp.Identity:InvalidRoleName": "Rolnaam '{0}' is ongeldig.", + "Volo.Abp.Identity:InvalidToken": "Ongeldig token.", + "Volo.Abp.Identity:InvalidUserName": "Gebruikersnaam '{0}' is ongeldig, mag alleen letters of cijfers bevatten.", + "Volo.Abp.Identity:LoginAlreadyAssociated": "Er bestaat al een gebruiker met deze login.", + "Volo.Abp.Identity:PasswordMismatch": "Incorrect wachtwoord.", + "Volo.Abp.Identity:PasswordRequiresDigit": "Wachtwoorden moeten minimaal één cijfer bevatten ('0' - '9').", + "Volo.Abp.Identity:PasswordRequiresLower": "Wachtwoorden moeten minstens één kleine letter bevatten ('a' - 'z').", + "Volo.Abp.Identity:PasswordRequiresNonAlphanumeric": "Wachtwoorden moeten minimaal één niet-alfanumeriek teken bevatten.", + "Volo.Abp.Identity:PasswordRequiresUpper": "Wachtwoorden moeten ten minste één hoofdletter bevatten ('A' - 'Z').", + "Volo.Abp.Identity:PasswordTooShort": "Wachtwoorden moeten uit minimaal {0} tekens bestaan.", + "Volo.Abp.Identity:RoleNotFound": "Rol {0} bestaat niet.", + "Volo.Abp.Identity:UserAlreadyHasPassword": "Gebruiker heeft al een wachtwoord ingesteld.", + "Volo.Abp.Identity:UserAlreadyInRole": "Gebruiker al in rol '{0}'.", + "Volo.Abp.Identity:UserLockedOut": "Gebruiker is geblokkeerd.", + "Volo.Abp.Identity:UserLockoutNotEnabled": "Lockout is niet ingeschakeld voor deze gebruiker.", + "Volo.Abp.Identity:UserNameNotFound": "Gebruiker {0} bestaat niet.", + "Volo.Abp.Identity:UserNotInRole": "Gebruiker speelt geen rol '{0}'.", + "Volo.Abp.Identity:PasswordConfirmationFailed": "Wachtwoord komt niet overeen met de wachtwoord bevestiging.", + "Volo.Abp.Identity:010005": "Statische rollen kunnen niet worden hernoemd.", + "Volo.Abp.Identity:010006": "Statische rollen kunnen niet worden verwijderd.", "Volo.Abp.Identity:010001": "U kunt uw eigen account niet verwijderen!", "Permission:IdentityManagement": "Identiteitsbeheer", "Permission:RoleManagement": "Rolbeheer", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json index 54d137988d..e8094553a9 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json @@ -35,34 +35,34 @@ "DisplayName:NewPasswordConfirm": "Powtierdź nowe hasło", "PasswordChangedMessage": "Twoje hasło zostało zmienione pomyślnie.", "PersonalSettingsSavedMessage": "Twoje personalne ustawienia zostały zapisane pomyślnie.", - "Identity.DefaultError": "Wystąpił niespodziewany błąd.", - "Identity.ConcurrencyFailure": "Optymistyczny błąd współbierzności, obiekt został zmodyfikowany.", - "Identity.DuplicateEmail": "Email '{0}' już istnieje.", - "Identity.DuplicateRoleName": "Rola '{0}' już istnieje.", - "Identity.DuplicateUserName": "Nazwa użytkownika '{0}' już istnieje.", - "Identity.InvalidEmail": "Email '{0}' jest niepoprawny.", - "Identity.InvalidPasswordHasherCompatibilityMode": "Dostawca PasswordHasherCompatibilityMode jest niepoprawny.", - "Identity.InvalidPasswordHasherIterationCount": "Wartość iteracji musi być większa od zera.", - "Identity.InvalidRoleName": "Rola '{0}' jest niepoprawna.", - "Identity.InvalidToken": "Niepoprawny token.", - "Identity.InvalidUserName": "Nazwa użytkownika '{0}' jest niepoprawna, może zawierać tylko litery i cyfry.", - "Identity.LoginAlreadyAssociated": "Użytkownik o tym loginie już istnieje.", - "Identity.PasswordMismatch": "Niepoprawne hasło.", - "Identity.PasswordRequiresDigit": "Hasło musi zawierać przynajmniej jedną cyfrę ('0'-'9').", - "Identity.PasswordRequiresLower": "Hasło musi zawierać przynajmniej jedną małą literę ('a'-'z').", - "Identity.PasswordRequiresNonAlphanumeric": "Hasło musi zawierać przynajmniej jeden znak alfanumeryczny.", - "Identity.PasswordRequiresUpper": "Hasło musi zawierać przynajmniej jedną wielką literę ('A'-'Z').", - "Identity.PasswordTooShort": "Hasło musi zawierać przynajmnie {0} znaków.", - "Identity.RoleNotFound": "Rola {0} nie istnieje.", - "Identity.UserAlreadyHasPassword": "Użytkownik ma już ustawione hasło.", - "Identity.UserAlreadyInRole": "Użytkownik jest już przypisany do roli '{0}'.", - "Identity.UserLockedOut": "Użytkownik jest zablokowany.", - "Identity.UserLockoutNotEnabled": "Blokada nie jest włączona dla tego użytkownika.", - "Identity.UserNameNotFound": "Użytkownik {0} nie istnieje.", - "Identity.UserNotInRole": "Użytkownik nie posiada roli '{0}'.", - "Identity.PasswordConfirmationFailed": "Podane hasła różnią się od siebie.", - "Identity.StaticRoleRenamingErrorMessage": "Statyczna rola nie może mieć zmienionej nazwy.", - "Identity.StaticRoleDeletionErrorMessage": "Statyczna rola nie może zostać usunięta.", + "Volo.Abp.Identity:DefaultError": "Wystąpił niespodziewany błąd.", + "Volo.Abp.Identity:ConcurrencyFailure": "Optymistyczny błąd współbierzności, obiekt został zmodyfikowany.", + "Volo.Abp.Identity:DuplicateEmail": "Email '{0}' już istnieje.", + "Volo.Abp.Identity:DuplicateRoleName": "Rola '{0}' już istnieje.", + "Volo.Abp.Identity:DuplicateUserName": "Nazwa użytkownika '{0}' już istnieje.", + "Volo.Abp.Identity:InvalidEmail": "Email '{0}' jest niepoprawny.", + "Volo.Abp.Identity:InvalidPasswordHasherCompatibilityMode": "Dostawca PasswordHasherCompatibilityMode jest niepoprawny.", + "Volo.Abp.Identity:InvalidPasswordHasherIterationCount": "Wartość iteracji musi być większa od zera.", + "Volo.Abp.Identity:InvalidRoleName": "Rola '{0}' jest niepoprawna.", + "Volo.Abp.Identity:InvalidToken": "Niepoprawny token.", + "Volo.Abp.Identity:InvalidUserName": "Nazwa użytkownika '{0}' jest niepoprawna, może zawierać tylko litery i cyfry.", + "Volo.Abp.Identity:LoginAlreadyAssociated": "Użytkownik o tym loginie już istnieje.", + "Volo.Abp.Identity:PasswordMismatch": "Niepoprawne hasło.", + "Volo.Abp.Identity:PasswordRequiresDigit": "Hasło musi zawierać przynajmniej jedną cyfrę ('0'-'9').", + "Volo.Abp.Identity:PasswordRequiresLower": "Hasło musi zawierać przynajmniej jedną małą literę ('a'-'z').", + "Volo.Abp.Identity:PasswordRequiresNonAlphanumeric": "Hasło musi zawierać przynajmniej jeden znak alfanumeryczny.", + "Volo.Abp.Identity:PasswordRequiresUpper": "Hasło musi zawierać przynajmniej jedną wielką literę ('A'-'Z').", + "Volo.Abp.Identity:PasswordTooShort": "Hasło musi zawierać przynajmnie {0} znaków.", + "Volo.Abp.Identity:RoleNotFound": "Rola {0} nie istnieje.", + "Volo.Abp.Identity:UserAlreadyHasPassword": "Użytkownik ma już ustawione hasło.", + "Volo.Abp.Identity:UserAlreadyInRole": "Użytkownik jest już przypisany do roli '{0}'.", + "Volo.Abp.Identity:UserLockedOut": "Użytkownik jest zablokowany.", + "Volo.Abp.Identity:UserLockoutNotEnabled": "Blokada nie jest włączona dla tego użytkownika.", + "Volo.Abp.Identity:UserNameNotFound": "Użytkownik {0} nie istnieje.", + "Volo.Abp.Identity:UserNotInRole": "Użytkownik nie posiada roli '{0}'.", + "Volo.Abp.Identity:PasswordConfirmationFailed": "Podane hasła różnią się od siebie.", + "Volo.Abp.Identity:010005": "Statyczna rola nie może mieć zmienionej nazwy.", + "Volo.Abp.Identity:010006": "Statyczna rola nie może zostać usunięta.", "Volo.Abp.Identity:010001": "Nie możesz usunąć swojego własnego konta!", "Permission:IdentityManagement": "Zarządzanie tożsamością", "Permission:RoleManagement": "Zarządanie rolami", @@ -73,4 +73,4 @@ "Permission:UserManagement": "Zarządzanie użytkownikami", "Permission:UserLookup": "Wyszukiwanie użytkownika" } -} \ No newline at end of file +} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json index 1dda38b2a5..99c2289e66 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json @@ -35,35 +35,35 @@ "DisplayName:NewPasswordConfirm": "Confirmar nova senha", "PasswordChangedMessage": "Sua senha foi alterada com sucesso.", "PersonalSettingsSavedMessage": "Suas configurações pessoais foram salvas com sucesso.", - "Identity.DefaultError": "Ocorreu uma falha desconhecida.", - "Identity.ConcurrencyFailure": "Falha de concorrência otimista, o objeto foi modificado.", - "Identity.DuplicateEmail": "O e-mail '{0}' já está em uso.", - "Identity.DuplicateRoleName": "O nome de perfil '{0}' já está em uso.", - "Identity.DuplicateUserName": "O usuário '{0}' já está em uso.", - "Identity.InvalidEmail": "E-mail '{0}' inválido.", - "Identity.InvalidPasswordHasherCompatibilityMode": "O PasswordHasherCompatibilityMode é inválido.", - "Identity.InvalidPasswordHasherIterationCount": "A contagem de iterações deve ser um inteiro positivo.", - "Identity.InvalidRoleName": "Perfil '{0}' inválido.", - "Identity.InvalidToken": "Token inválido.", - "Identity.InvalidUserName": "Usuário '{0}' é inválido, somente pode conter letras ou números.", - "Identity.LoginAlreadyAssociated": "Um usuário com este login já existe.", - "Identity.PasswordMismatch": "Senha incorreta.", - "Identity.PasswordRequiresDigit": "Senhas devem possuir pelo menos um dígito ('0'-'9').", - "Identity.PasswordRequiresLower": "Senhas devem possuir pelo menos uma letra minúscula ('a'-'z').", - "Identity.PasswordRequiresNonAlphanumeric": "Senhas devem possuir pelo menos um caractere especial.", - "Identity.PasswordRequiresUpper": "Senhas devem possuir pelo menos uma letra maiúscula ('A'-'Z').", - "Identity.PasswordTooShort": "Senhas devem possuir pelo menos {0} caracteres.", - "Identity.RoleNotFound": "Perfil {0} não existe.", - "Identity.UserAlreadyHasPassword": "O usuário já possui uma senha.", - "Identity.UserAlreadyInRole": "Usuário já possui o perfil '{0}'.", - "Identity.UserLockedOut": "O usuário está bloqueado.", - "Identity.UserLockoutNotEnabled": "Este usuário não pode ser bloqueado.", - "Identity.UserNameNotFound": "Usuário {0} não existe.", - "Identity.UserNotInRole": "Usuário não está no perfil '{0}'.", - "Identity.PasswordConfirmationFailed": "A senha não confere com a confirmação de senha.", - "Identity.StaticRoleRenamingErrorMessage": "Perfis estáticos não podem ser renomeados.", - "Identity.StaticRoleDeletionErrorMessage": "Perfis estáticos não podem ser excluídos.", - "Identity.OrganizationUnit.DuplicateDisplayNameWarning": "Já existe uma unidade organizacional com o nome {0}. Duas unidades com o mesmo nome não pode ser criada no mesmo nível.", + "Volo.Abp.Identity:DefaultError": "Ocorreu uma falha desconhecida.", + "Volo.Abp.Identity:ConcurrencyFailure": "Falha de concorrência otimista, o objeto foi modificado.", + "Volo.Abp.Identity:DuplicateEmail": "O e-mail '{0}' já está em uso.", + "Volo.Abp.Identity:DuplicateRoleName": "O nome de perfil '{0}' já está em uso.", + "Volo.Abp.Identity:DuplicateUserName": "O usuário '{0}' já está em uso.", + "Volo.Abp.Identity:InvalidEmail": "E-mail '{0}' inválido.", + "Volo.Abp.Identity:InvalidPasswordHasherCompatibilityMode": "O PasswordHasherCompatibilityMode é inválido.", + "Volo.Abp.Identity:InvalidPasswordHasherIterationCount": "A contagem de iterações deve ser um inteiro positivo.", + "Volo.Abp.Identity:InvalidRoleName": "Perfil '{0}' inválido.", + "Volo.Abp.Identity:InvalidToken": "Token inválido.", + "Volo.Abp.Identity:InvalidUserName": "Usuário '{0}' é inválido, somente pode conter letras ou números.", + "Volo.Abp.Identity:LoginAlreadyAssociated": "Um usuário com este login já existe.", + "Volo.Abp.Identity:PasswordMismatch": "Senha incorreta.", + "Volo.Abp.Identity:PasswordRequiresDigit": "Senhas devem possuir pelo menos um dígito ('0'-'9').", + "Volo.Abp.Identity:PasswordRequiresLower": "Senhas devem possuir pelo menos uma letra minúscula ('a'-'z').", + "Volo.Abp.Identity:PasswordRequiresNonAlphanumeric": "Senhas devem possuir pelo menos um caractere especial.", + "Volo.Abp.Identity:PasswordRequiresUpper": "Senhas devem possuir pelo menos uma letra maiúscula ('A'-'Z').", + "Volo.Abp.Identity:PasswordTooShort": "Senhas devem possuir pelo menos {0} caracteres.", + "Volo.Abp.Identity:RoleNotFound": "Perfil {0} não existe.", + "Volo.Abp.Identity:UserAlreadyHasPassword": "O usuário já possui uma senha.", + "Volo.Abp.Identity:UserAlreadyInRole": "Usuário já possui o perfil '{0}'.", + "Volo.Abp.Identity:UserLockedOut": "O usuário está bloqueado.", + "Volo.Abp.Identity:UserLockoutNotEnabled": "Este usuário não pode ser bloqueado.", + "Volo.Abp.Identity:UserNameNotFound": "Usuário {0} não existe.", + "Volo.Abp.Identity:UserNotInRole": "Usuário não está no perfil '{0}'.", + "Volo.Abp.Identity:PasswordConfirmationFailed": "A senha não confere com a confirmação de senha.", + "Volo.Abp.Identity:010005": "Perfis estáticos não podem ser renomeados.", + "Volo.Abp.Identity:010006": "Perfis estáticos não podem ser excluídos.", + "Volo.Abp.Identity:010004": "Já existe uma unidade organizacional com o nome {0}. Duas unidades com o mesmo nome não pode ser criada no mesmo nível.", "Volo.Abp.Identity:010001": "Você não pode deletar sua própria conta!", "Permission:IdentityManagement": "Acessos", "Permission:RoleManagement": "Perfis", @@ -74,4 +74,4 @@ "Permission:UserManagement": "Usuários", "Permission:UserLookup": "Pesquisa de usuário" } -} \ No newline at end of file +} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json index 1df7b63bfe..ebc304484a 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json @@ -35,34 +35,34 @@ "DisplayName:NewPasswordConfirm": "Подтверждение нового пароля", "PasswordChangedMessage": "Ваш пароль был успешно изменен.", "PersonalSettingsSavedMessage": "Ваши персональные настройки были успешно сохранены.", - "Identity.DefaultError": "Возникла непредвиденная ошибка.", - "Identity.ConcurrencyFailure": "Ошибка оптимального управления многопоточностью, объект был изменен.", - "Identity.DuplicateEmail": "Электронная почта '{0}' уже зарегистрирована.", - "Identity.DuplicateRoleName": "Имя роли '{0}' уже занято.", - "Identity.DuplicateUserName": "Имя пользователя '{0}' уже занято.", - "Identity.InvalidEmail": "Адрес электронной почты '{0}' недействителен.", - "Identity.InvalidPasswordHasherCompatibilityMode": "Предоставленный PasswordHasherCompatibilityMode недействителен.", - "Identity.InvalidPasswordHasherIterationCount": "Число итераций должно быть положительным целым числом.", - "Identity.InvalidRoleName": "Имя роли '{0}' недопустимо.", - "Identity.InvalidToken": "Недопустимый маркер.", - "Identity.InvalidUserName": "Имя пользователя '{0}' недопустимо и может содержать только буквы или цифры.", - "Identity.LoginAlreadyAssociated": "Пользователь с таким логином уже существует.", - "Identity.PasswordMismatch": "Неверный пароль.", - "Identity.PasswordRequiresDigit": "Пароль должен содержать по крайней мере одну цифру.", - "Identity.PasswordRequiresLower": "Пароль должен содержать хотя бы одну строчную букву.", - "Identity.PasswordRequiresNonAlphanumeric": "Пароль должен иметь по крайней мере один не буквенно-цифровой символ.", - "Identity.PasswordRequiresUpper": "Пароль должен иметь хотя бы одну букву верхнего регистра.", - "Identity.PasswordTooShort": "Пароль должен содержать не менее {0} символов.", - "Identity.RoleNotFound": "Роль {0} не существует.", - "Identity.UserAlreadyHasPassword": "У пользователя уже установлен пароль.", - "Identity.UserAlreadyInRole": "Пользователь уже имеет роль '{0}'.", - "Identity.UserLockedOut": "Пользователь временно заблокирован.", - "Identity.UserLockoutNotEnabled": "Блокировка не активирована для этого пользователя.", - "Identity.UserNameNotFound": "Пользователь {0} не существует.", - "Identity.UserNotInRole": "Пользователь не имеет роль '{0}'.", - "Identity.PasswordConfirmationFailed": "Пароли не совпадают.", - "Identity.StaticRoleRenamingErrorMessage": "Статические роли не могут быть переименованы.", - "Identity.StaticRoleDeletionErrorMessage": "Статические роли не могут быть удалены.", + "Volo.Abp.Identity:DefaultError": "Возникла непредвиденная ошибка.", + "Volo.Abp.Identity:ConcurrencyFailure": "Ошибка оптимального управления многопоточностью, объект был изменен.", + "Volo.Abp.Identity:DuplicateEmail": "Электронная почта '{0}' уже зарегистрирована.", + "Volo.Abp.Identity:DuplicateRoleName": "Имя роли '{0}' уже занято.", + "Volo.Abp.Identity:DuplicateUserName": "Имя пользователя '{0}' уже занято.", + "Volo.Abp.Identity:InvalidEmail": "Адрес электронной почты '{0}' недействителен.", + "Volo.Abp.Identity:InvalidPasswordHasherCompatibilityMode": "Предоставленный PasswordHasherCompatibilityMode недействителен.", + "Volo.Abp.Identity:InvalidPasswordHasherIterationCount": "Число итераций должно быть положительным целым числом.", + "Volo.Abp.Identity:InvalidRoleName": "Имя роли '{0}' недопустимо.", + "Volo.Abp.Identity:InvalidToken": "Недопустимый маркер.", + "Volo.Abp.Identity:InvalidUserName": "Имя пользователя '{0}' недопустимо и может содержать только буквы или цифры.", + "Volo.Abp.Identity:LoginAlreadyAssociated": "Пользователь с таким логином уже существует.", + "Volo.Abp.Identity:PasswordMismatch": "Неверный пароль.", + "Volo.Abp.Identity:PasswordRequiresDigit": "Пароль должен содержать по крайней мере одну цифру.", + "Volo.Abp.Identity:PasswordRequiresLower": "Пароль должен содержать хотя бы одну строчную букву.", + "Volo.Abp.Identity:PasswordRequiresNonAlphanumeric": "Пароль должен иметь по крайней мере один не буквенно-цифровой символ.", + "Volo.Abp.Identity:PasswordRequiresUpper": "Пароль должен иметь хотя бы одну букву верхнего регистра.", + "Volo.Abp.Identity:PasswordTooShort": "Пароль должен содержать не менее {0} символов.", + "Volo.Abp.Identity:RoleNotFound": "Роль {0} не существует.", + "Volo.Abp.Identity:UserAlreadyHasPassword": "У пользователя уже установлен пароль.", + "Volo.Abp.Identity:UserAlreadyInRole": "Пользователь уже имеет роль '{0}'.", + "Volo.Abp.Identity:UserLockedOut": "Пользователь временно заблокирован.", + "Volo.Abp.Identity:UserLockoutNotEnabled": "Блокировка не активирована для этого пользователя.", + "Volo.Abp.Identity:UserNameNotFound": "Пользователь {0} не существует.", + "Volo.Abp.Identity:UserNotInRole": "Пользователь не имеет роль '{0}'.", + "Volo.Abp.Identity:PasswordConfirmationFailed": "Пароли не совпадают.", + "Volo.Abp.Identity:010005": "Статические роли не могут быть переименованы.", + "Volo.Abp.Identity:010006": "Статические роли не могут быть удалены.", "Volo.Abp.Identity:010001": "Вы не можете удалить свой собственный аккаунт!", "Permission:IdentityManagement": "Управление идентификацией", "Permission:RoleManagement": "Управление ролями", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json index 5f3cd96c55..8471735066 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json @@ -35,34 +35,34 @@ "DisplayName:NewPasswordConfirm": "Potrdite novo geslo", "PasswordChangedMessage": "Vaše geslo je bilo uspešno spremenjeno.", "PersonalSettingsSavedMessage": "Vaše osebne nastavitve so bile uspešno shranjene.", - "Identity.DefaultError": "Zgodila se je neznana napaka.", - "Identity.ConcurrencyFailure": "Napaka pri optimistični sočasnosti, objekt je bil spremenjen.", - "Identity.DuplicateEmail": "E-poštni naslov '{0}' je že zaseden.", - "Identity.DuplicateRoleName": "Naziv vloge '{0}' je že zasedeno.", - "Identity.DuplicateUserName": "Uporabniško ime '{0}' je že zasedeno.", - "Identity.InvalidEmail": "E-poštni naslov '{0}' ni veljaven.", - "Identity.InvalidPasswordHasherCompatibilityMode": "Navedeni PasswordHasherCompatibilityMode ni veljaven.", - "Identity.InvalidPasswordHasherIterationCount": "Število iteracij mora biti pozitivno celo število.", - "Identity.InvalidRoleName": "Naziv vloge '{0}' ni veljaven.", - "Identity.InvalidToken": "Neveljaven žeton.", - "Identity.InvalidUserName": "Uporabniško ime '{0}' ni veljavno, vsebuje lahko le črke in številke.", - "Identity.LoginAlreadyAssociated": "Uporabnik s to prijavo že obstaja.", - "Identity.PasswordMismatch": "Nepravilno geslo.", - "Identity.PasswordRequiresDigit": "Gesla morajo imeti vsaj eno številko ('0'-'9').", - "Identity.PasswordRequiresLower": "Gesla morajo imeti vsaj eno malo črko ('a'-'z').", - "Identity.PasswordRequiresNonAlphanumeric": "Gesla morajo imeti vsaj en ne-alfanumerični znak.", - "Identity.PasswordRequiresUpper": "Gesla morajo imeti vsaj eno veliko črko ('A'-'Z').", - "Identity.PasswordTooShort": "Gesla morajo biti dolga vsaj {0} znakov.", - "Identity.RoleNotFound": "Vloga {0} ne obstaja.", - "Identity.UserAlreadyHasPassword": "Uporabnik že ima nastavljeno geslo.", - "Identity.UserAlreadyInRole": "Uporabnik že ima dodeljeno vlogo '{0}'.", - "Identity.UserLockedOut": "Uporabnik je zaklenjen.", - "Identity.UserLockoutNotEnabled": "Zaklepanje za tega uporabnika ni omogočeno.", - "Identity.UserNameNotFound": "Uporabnik {0} ne obstaja.", - "Identity.UserNotInRole": "Uporabnik nima dodeljene vloge '{0}'.", - "Identity.PasswordConfirmationFailed": "Geslo se ne ujema s potrditvenim geslom.", - "Identity.StaticRoleRenamingErrorMessage": "Statičnih vlog ni mogoče preimenovati.", - "Identity.StaticRoleDeletionErrorMessage": "Statičnih vlog ni mogoče izbrisati.", + "Volo.Abp.Identity:DefaultError": "Zgodila se je neznana napaka.", + "Volo.Abp.Identity:ConcurrencyFailure": "Napaka pri optimistični sočasnosti, objekt je bil spremenjen.", + "Volo.Abp.Identity:DuplicateEmail": "E-poštni naslov '{0}' je že zaseden.", + "Volo.Abp.Identity:DuplicateRoleName": "Naziv vloge '{0}' je že zasedeno.", + "Volo.Abp.Identity:DuplicateUserName": "Uporabniško ime '{0}' je že zasedeno.", + "Volo.Abp.Identity:InvalidEmail": "E-poštni naslov '{0}' ni veljaven.", + "Volo.Abp.Identity:InvalidPasswordHasherCompatibilityMode": "Navedeni PasswordHasherCompatibilityMode ni veljaven.", + "Volo.Abp.Identity:InvalidPasswordHasherIterationCount": "Število iteracij mora biti pozitivno celo število.", + "Volo.Abp.Identity:InvalidRoleName": "Naziv vloge '{0}' ni veljaven.", + "Volo.Abp.Identity:InvalidToken": "Neveljaven žeton.", + "Volo.Abp.Identity:InvalidUserName": "Uporabniško ime '{0}' ni veljavno, vsebuje lahko le črke in številke.", + "Volo.Abp.Identity:LoginAlreadyAssociated": "Uporabnik s to prijavo že obstaja.", + "Volo.Abp.Identity:PasswordMismatch": "Nepravilno geslo.", + "Volo.Abp.Identity:PasswordRequiresDigit": "Gesla morajo imeti vsaj eno številko ('0'-'9').", + "Volo.Abp.Identity:PasswordRequiresLower": "Gesla morajo imeti vsaj eno malo črko ('a'-'z').", + "Volo.Abp.Identity:PasswordRequiresNonAlphanumeric": "Gesla morajo imeti vsaj en ne-alfanumerični znak.", + "Volo.Abp.Identity:PasswordRequiresUpper": "Gesla morajo imeti vsaj eno veliko črko ('A'-'Z').", + "Volo.Abp.Identity:PasswordTooShort": "Gesla morajo biti dolga vsaj {0} znakov.", + "Volo.Abp.Identity:RoleNotFound": "Vloga {0} ne obstaja.", + "Volo.Abp.Identity:UserAlreadyHasPassword": "Uporabnik že ima nastavljeno geslo.", + "Volo.Abp.Identity:UserAlreadyInRole": "Uporabnik že ima dodeljeno vlogo '{0}'.", + "Volo.Abp.Identity:UserLockedOut": "Uporabnik je zaklenjen.", + "Volo.Abp.Identity:UserLockoutNotEnabled": "Zaklepanje za tega uporabnika ni omogočeno.", + "Volo.Abp.Identity:UserNameNotFound": "Uporabnik {0} ne obstaja.", + "Volo.Abp.Identity:UserNotInRole": "Uporabnik nima dodeljene vloge '{0}'.", + "Volo.Abp.Identity:PasswordConfirmationFailed": "Geslo se ne ujema s potrditvenim geslom.", + "Volo.Abp.Identity:010005": "Statičnih vlog ni mogoče preimenovati.", + "Volo.Abp.Identity:010006": "Statičnih vlog ni mogoče izbrisati.", "Volo.Abp.Identity:010001": "Ne morete izbrisati svojega lastnega računa!", "Permission:IdentityManagement": "Upravljanje identitet", "Permission:RoleManagement": "Upravljanje vlog", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json index b270f344ef..2ad19c80f4 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json @@ -35,8 +35,8 @@ "DisplayName:NewPasswordConfirm": "Yeni şifre (tekrar)", "PasswordChangedMessage": "Şifreniz başarıyla değiştirildi.", "PersonalSettingsSavedMessage": "Kişisel bilgileriniz başarıyla kaydedildi.", - "Volo.Abp.Identity:StaticRoleRenamingErrorMessage": "Bir Sabit rolün ismi değiştirilemez.", - "Volo.Abp.Identity:StaticRoleDeletionErrorMessage": "Bir Sabit rol silinemez.", + "Volo.Abp.Identity:010005": "Bir Sabit rolün ismi değiştirilemez.", + "Volo.Abp.Identity:010006": "Bir Sabit rol silinemez.", "Volo.Abp.Identity:DefaultError": "Bilinmeyen bir hata oluştu.", "Volo.Abp.Identity:ConcurrencyFailure": "İyimser eşzamanlılık hatası. Nesne değiştirilmiş.", "Volo.Abp.Identity:DuplicateEmail": "'{0}' email adresi zaten alınmış.", @@ -63,9 +63,11 @@ "Volo.Abp.Identity:UserNameNotFound": "{0} kullanıcısı bulunamadı.", "Volo.Abp.Identity:UserNotInRole": "Kullanıcı '{0}' rolünde değil.", "Volo.Abp.Identity:PasswordConfirmationFailed": "Yeni şifre ile onay şifresi uyuşmuyor.", - "Identity.OrganizationUnit.DuplicateDisplayNameWarning": "{0} isminde bir birim zaten var. Aynı seviyede aynı isimli iki birim olamaz.", - "Identity.OrganizationUnit.MaxUserMembershipCount": "Bir kullanıcı için izin verilen en fazla organizasyon birimi sayısı", "Volo.Abp.Identity:010001": "Kendi hesabınızı silemezsiniz!", + "Volo.Abp.Identity:010002": "Bir kullanıcı en fazla {MaxUserMembershipCount} organizasyon birimine üye olabilir!", + "Volo.Abp.Identity:010003": "Kimliği dışarıdan alınan kullanıcıların şifresi değiştirilemez!", + "Volo.Abp.Identity:010004": "{0} isminde bir birim zaten var. Aynı seviyede aynı isimli iki birim olamaz.", + "Identity.OrganizationUnit.MaxUserMembershipCount": "Bir kullanıcı için izin verilen en fazla organizasyon birimi sayısı", "Permission:IdentityManagement": "Kimlik yönetimi", "Permission:RoleManagement": "Rol yönetimi", "Permission:Create": "Oluşturma", @@ -74,7 +76,6 @@ "Permission:ChangePermissions": "İzinleri değiştirme", "Permission:UserManagement": "Kullanıcı yönetimi", "Permission:UserLookup": "Kullanıcı sorgulama", - "Volo.Abp.Identity:010002": "Bir kullanıcı en fazla {MaxUserMembershipCount} organizasyon birimine üye olabilir!", "DisplayName:Abp.Identity.Password.RequiredLength": "Uzunluk gerekli", "DisplayName:Abp.Identity.Password.RequiredUniqueChars": "Tekil karakter gerekli", "DisplayName:Abp.Identity.Password.RequireNonAlphanumeric": "Alfasayısal olmayan karakter gerekli", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json index 64690959b7..a241a4d515 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json @@ -35,34 +35,34 @@ "DisplayName:NewPasswordConfirm": "Xác nhận mật khẩu", "PasswordChangedMessage": "Mật khẩu của bạn đã được thay đổi thành công.", "PersonalSettingsSavedMessage": "Thiết lập của bạn đã được lưu lại thành công.", - "Identity.DefaultError": "Một thất bại chưa biết đã xảy ra.", - "Identity.ConcurrencyFailure": "Thất bại đồng thời lạc quan, đối tượng đã được sửa đổi.", - "Identity.DuplicateEmail": "Email '{0}' đã được sử dụng.", - "Identity.DuplicateRoleName": "Tên vài trò '{0}' đã được sử dụng.", - "Identity.DuplicateUserName": "User name '{0}' đã được sử dụng.", - "Identity.InvalidEmail": "Email '{0}' Không hợp lệ.", - "Identity.InvalidPasswordHasherCompatibilityMode": "PasswordHasherCompatibilityMode được cung cấp không hợp lệ.", - "Identity.InvalidPasswordHasherIterationCount": "Số lần lặp phải là số nguyên dương.", - "Identity.InvalidRoleName": "Tên người dùng '{0}' Không hợp lệ.", - "Identity.InvalidToken": "Token không hợp lệ.", - "Identity.InvalidUserName": "Tên người dùng '{0}' không hợp lệ, chỉ có thể chứa chữ cái hoặc chữ số.", - "Identity.LoginAlreadyAssociated": "Một người dùng có thông tin đăng nhập này đã tồn tại.", - "Identity.PasswordMismatch": "Mật khẩu không đúng.", - "Identity.PasswordRequiresDigit": "Mật khẩu phải có ít nhất một chữ số ('0'-'9').", - "Identity.PasswordRequiresLower": "Mật khẩu phải có ít nhất một chữ thường ('a'-'z').", - "Identity.PasswordRequiresNonAlphanumeric": "Mật khẩu phải có ít nhất một ký tự không phải là chữ và số.", - "Identity.PasswordRequiresUpper": "Mật khẩu phải có ít nhất một chữ hoa ('A'-'Z').", - "Identity.PasswordTooShort": "Mật khẩu phải ít nhất {0} kí tự.", - "Identity.RoleNotFound": "Vai trò {0} không tồn tại.", - "Identity.UserAlreadyHasPassword": "Người dùng đã có một mật khẩu.", - "Identity.UserAlreadyInRole": "Người dùng đã có vai trò '{0}'.", - "Identity.UserLockedOut": "Người dùng bị khóa.", - "Identity.UserLockoutNotEnabled": "Khóa không được kích hoạt cho người dùng này.", - "Identity.UserNameNotFound": "Người dùng {0} không tồn tại.", - "Identity.UserNotInRole": "Người dùng không có vai trò '{0}'.", - "Identity.PasswordConfirmationFailed": "Mật khẩu không khớp với mật khẩu xác nhận.", - "Identity.StaticRoleRenamingErrorMessage": "Vai trò này là cố định không được phép đổi tên.", - "Identity.StaticRoleDeletionErrorMessage": "Vai trò này là cố định không được phép xóa.", + "Volo.Abp.Identity:DefaultError": "Một thất bại chưa biết đã xảy ra.", + "Volo.Abp.Identity:ConcurrencyFailure": "Thất bại đồng thời lạc quan, đối tượng đã được sửa đổi.", + "Volo.Abp.Identity:DuplicateEmail": "Email '{0}' đã được sử dụng.", + "Volo.Abp.Identity:DuplicateRoleName": "Tên vài trò '{0}' đã được sử dụng.", + "Volo.Abp.Identity:DuplicateUserName": "User name '{0}' đã được sử dụng.", + "Volo.Abp.Identity:InvalidEmail": "Email '{0}' Không hợp lệ.", + "Volo.Abp.Identity:InvalidPasswordHasherCompatibilityMode": "PasswordHasherCompatibilityMode được cung cấp không hợp lệ.", + "Volo.Abp.Identity:InvalidPasswordHasherIterationCount": "Số lần lặp phải là số nguyên dương.", + "Volo.Abp.Identity:InvalidRoleName": "Tên người dùng '{0}' Không hợp lệ.", + "Volo.Abp.Identity:InvalidToken": "Token không hợp lệ.", + "Volo.Abp.Identity:InvalidUserName": "Tên người dùng '{0}' không hợp lệ, chỉ có thể chứa chữ cái hoặc chữ số.", + "Volo.Abp.Identity:LoginAlreadyAssociated": "Một người dùng có thông tin đăng nhập này đã tồn tại.", + "Volo.Abp.Identity:PasswordMismatch": "Mật khẩu không đúng.", + "Volo.Abp.Identity:PasswordRequiresDigit": "Mật khẩu phải có ít nhất một chữ số ('0'-'9').", + "Volo.Abp.Identity:PasswordRequiresLower": "Mật khẩu phải có ít nhất một chữ thường ('a'-'z').", + "Volo.Abp.Identity:PasswordRequiresNonAlphanumeric": "Mật khẩu phải có ít nhất một ký tự không phải là chữ và số.", + "Volo.Abp.Identity:PasswordRequiresUpper": "Mật khẩu phải có ít nhất một chữ hoa ('A'-'Z').", + "Volo.Abp.Identity:PasswordTooShort": "Mật khẩu phải ít nhất {0} kí tự.", + "Volo.Abp.Identity:RoleNotFound": "Vai trò {0} không tồn tại.", + "Volo.Abp.Identity:UserAlreadyHasPassword": "Người dùng đã có một mật khẩu.", + "Volo.Abp.Identity:UserAlreadyInRole": "Người dùng đã có vai trò '{0}'.", + "Volo.Abp.Identity:UserLockedOut": "Người dùng bị khóa.", + "Volo.Abp.Identity:UserLockoutNotEnabled": "Khóa không được kích hoạt cho người dùng này.", + "Volo.Abp.Identity:UserNameNotFound": "Người dùng {0} không tồn tại.", + "Volo.Abp.Identity:UserNotInRole": "Người dùng không có vai trò '{0}'.", + "Volo.Abp.Identity:PasswordConfirmationFailed": "Mật khẩu không khớp với mật khẩu xác nhận.", + "Volo.Abp.Identity:010005": "Vai trò này là cố định không được phép đổi tên.", + "Volo.Abp.Identity:010006": "Vai trò này là cố định không được phép xóa.", "Volo.Abp.Identity:010001": "Bạn không thể xóa tài khoản của riêng bạn!", "Permission:IdentityManagement": "Quản lý danh tính", "Permission:RoleManagement": "Quản lý vai trò", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json index ffeb4d0d40..5494581c6a 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json @@ -35,35 +35,35 @@ "DisplayName:NewPasswordConfirm": "确认新密码", "PasswordChangedMessage": "你已成功更改密码.", "PersonalSettingsSavedMessage": "你的个人设置保存成功.", - "Identity.DefaultError": "发生了一个未知错误.", - "Identity.ConcurrencyFailure": "对象已被修改,乐观并发失败.", - "Identity.DuplicateEmail": "邮箱 '{0}' 已存在.", - "Identity.DuplicateRoleName": "角色名 '{0}' 已存在.", - "Identity.DuplicateUserName": "用户名 '{0}' 已存在.", - "Identity.InvalidEmail": "邮箱 '{0}' 无效.", - "Identity.InvalidPasswordHasherCompatibilityMode": "提供的 PasswordHasherCompatibilityMode 无效.", - "Identity.InvalidPasswordHasherIterationCount": "迭代计数必须是正整数.", - "Identity.InvalidRoleName": "角色名 '{0}' 无效.", - "Identity.InvalidToken": "token无效.", - "Identity.InvalidUserName": "用户名 '{0}' 无效, 只能包含字母或数字.", - "Identity.LoginAlreadyAssociated": "此登录名的用户已存在.", - "Identity.PasswordMismatch": "密码错误.", - "Identity.PasswordRequiresDigit": "密码至少包含一位数字 ('0'-'9').", - "Identity.PasswordRequiresLower": "密码至少包含一位小写字母 ('a'-'z').", - "Identity.PasswordRequiresNonAlphanumeric": "密码至少包含一位非字母数字字符.", - "Identity.PasswordRequiresUpper": "密码至少包含一位大写字母 ('A'-'Z').", - "Identity.PasswordTooShort": "密码至少为{0}个字符.", - "Identity.RoleNotFound": "角色 {0} 不存在.", - "Identity.UserAlreadyHasPassword": "用户已设置密码.", - "Identity.UserAlreadyInRole": "用户已具有角色 '{0}'.", - "Identity.UserLockedOut": "用户被锁定.", - "Identity.UserLockoutNotEnabled": "该用户未启用锁定.", - "Identity.UserNameNotFound": "用户 {0} 不存在.", - "Identity.UserNotInRole": "用户不具有 '{0}' 角色.", - "Identity.PasswordConfirmationFailed": "密码或确认密码不一致.", - "Identity.StaticRoleRenamingErrorMessage": "无法重命名静态角色.", - "Identity.StaticRoleDeletionErrorMessage": "无法删除静态角色.", - "Identity.OrganizationUnit.DuplicateDisplayNameWarning": "已存在名为 {0} 的组织单位. 无法在同一级别创建相同名称的组织单位.", + "Volo.Abp.Identity:DefaultError": "发生了一个未知错误.", + "Volo.Abp.Identity:ConcurrencyFailure": "对象已被修改,乐观并发失败.", + "Volo.Abp.Identity:DuplicateEmail": "邮箱 '{0}' 已存在.", + "Volo.Abp.Identity:DuplicateRoleName": "角色名 '{0}' 已存在.", + "Volo.Abp.Identity:DuplicateUserName": "用户名 '{0}' 已存在.", + "Volo.Abp.Identity:InvalidEmail": "邮箱 '{0}' 无效.", + "Volo.Abp.Identity:InvalidPasswordHasherCompatibilityMode": "提供的 PasswordHasherCompatibilityMode 无效.", + "Volo.Abp.Identity:InvalidPasswordHasherIterationCount": "迭代计数必须是正整数.", + "Volo.Abp.Identity:InvalidRoleName": "角色名 '{0}' 无效.", + "Volo.Abp.Identity:InvalidToken": "token无效.", + "Volo.Abp.Identity:InvalidUserName": "用户名 '{0}' 无效, 只能包含字母或数字.", + "Volo.Abp.Identity:LoginAlreadyAssociated": "此登录名的用户已存在.", + "Volo.Abp.Identity:PasswordMismatch": "密码错误.", + "Volo.Abp.Identity:PasswordRequiresDigit": "密码至少包含一位数字 ('0'-'9').", + "Volo.Abp.Identity:PasswordRequiresLower": "密码至少包含一位小写字母 ('a'-'z').", + "Volo.Abp.Identity:PasswordRequiresNonAlphanumeric": "密码至少包含一位非字母数字字符.", + "Volo.Abp.Identity:PasswordRequiresUpper": "密码至少包含一位大写字母 ('A'-'Z').", + "Volo.Abp.Identity:PasswordTooShort": "密码至少为{0}个字符.", + "Volo.Abp.Identity:RoleNotFound": "角色 {0} 不存在.", + "Volo.Abp.Identity:UserAlreadyHasPassword": "用户已设置密码.", + "Volo.Abp.Identity:UserAlreadyInRole": "用户已具有角色 '{0}'.", + "Volo.Abp.Identity:UserLockedOut": "用户被锁定.", + "Volo.Abp.Identity:UserLockoutNotEnabled": "该用户未启用锁定.", + "Volo.Abp.Identity:UserNameNotFound": "用户 {0} 不存在.", + "Volo.Abp.Identity:UserNotInRole": "用户不具有 '{0}' 角色.", + "Volo.Abp.Identity:PasswordConfirmationFailed": "密码或确认密码不一致.", + "Volo.Abp.Identity:010005": "无法重命名静态角色.", + "Volo.Abp.Identity:010006": "无法删除静态角色.", + "Volo.Abp.Identity:010004": "已存在名为 {0} 的组织单位. 无法在同一级别创建相同名称的组织单位.", "Volo.Abp.Identity:010001": "您无法删除自己的帐户!", "Permission:IdentityManagement": "身份标识管理", "Permission:RoleManagement": "角色管理", @@ -99,6 +99,5 @@ "Description:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "登录时是否需要验证的手机号码.", "Description:Abp.Identity.User.IsUserNameUpdateEnabled": "是否允许用户更新用户名.", "Description:Abp.Identity.User.IsEmailUpdateEnabled": "是否允许用户更新电子邮箱." - } -} \ No newline at end of file +} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json index b6e42acea2..edd21e10fe 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json @@ -35,35 +35,35 @@ "DisplayName:NewPasswordConfirm": "確認新密碼", "PasswordChangedMessage": "你已成功更改密碼.", "PersonalSettingsSavedMessage": "你的個人設置保存成功.", - "Identity.DefaultError": "發生了一個未知錯誤.", - "Identity.ConcurrencyFailure": "對象已被修改,因樂觀並行控制導致失敗.", - "Identity.DuplicateEmail": "電子信箱 '{0}' 已存在.", - "Identity.DuplicateRoleName": "角色名 '{0}' 已存在.", - "Identity.DuplicateUserName": "使用者名稱 '{0}' 已存在.", - "Identity.InvalidEmail": "電子信箱 '{0}' 無效.", - "Identity.InvalidPasswordHasherCompatibilityMode": "提供的 PasswordHasherCompatibilityMode 無效.", - "Identity.InvalidPasswordHasherIterationCount": "迭代計數必須是正整數.", - "Identity.InvalidRoleName": "角色名 '{0}' 無效.", - "Identity.InvalidToken": "token無效.", - "Identity.InvalidUserName": "使用者名稱 '{0}' 無效, 只能包含字母或數字.", - "Identity.LoginAlreadyAssociated": "此登入名的使用者已存在.", - "Identity.PasswordMismatch": "密碼錯誤.", - "Identity.PasswordRequiresDigit": "密碼至少包含一位數字 ('0'-'9').", - "Identity.PasswordRequiresLower": "密碼至少包含一位小寫字母 ('a'-'z').", - "Identity.PasswordRequiresNonAlphanumeric": "密碼至少包含一位非字母數字字元.", - "Identity.PasswordRequiresUpper": "密碼至少包含一位大寫字母 ('A'-'Z').", - "Identity.PasswordTooShort": "密碼至少為{0}個字元.", - "Identity.RoleNotFound": "角色 {0} 不存在.", - "Identity.UserAlreadyHasPassword": "使用者已設置密碼.", - "Identity.UserAlreadyInRole": "使用者已具有角色 '{0}'.", - "Identity.UserLockedOut": "使用者被鎖定.", - "Identity.UserLockoutNotEnabled": "該使用者未啟用鎖定.", - "Identity.UserNameNotFound": "使用者 {0} 不存在.", - "Identity.UserNotInRole": "使用者不具有 '{0}' 角色.", - "Identity.PasswordConfirmationFailed": "密碼或確認密碼不一致.", - "Identity.StaticRoleRenamingErrorMessage": "無法重命名靜態角色.", - "Identity.StaticRoleDeletionErrorMessage": "無法刪除靜態角色.", - "Identity.OrganizationUnit.DuplicateDisplayNameWarning": "組織內單位內已包含名稱 {0}.同一層級組織,兩個單位不能有相同名稱", + "Volo.Abp.Identity:DefaultError": "發生了一個未知錯誤.", + "Volo.Abp.Identity:ConcurrencyFailure": "對象已被修改,因樂觀並行控制導致失敗.", + "Volo.Abp.Identity:DuplicateEmail": "電子信箱 '{0}' 已存在.", + "Volo.Abp.Identity:DuplicateRoleName": "角色名 '{0}' 已存在.", + "Volo.Abp.Identity:DuplicateUserName": "使用者名稱 '{0}' 已存在.", + "Volo.Abp.Identity:InvalidEmail": "電子信箱 '{0}' 無效.", + "Volo.Abp.Identity:InvalidPasswordHasherCompatibilityMode": "提供的 PasswordHasherCompatibilityMode 無效.", + "Volo.Abp.Identity:InvalidPasswordHasherIterationCount": "迭代計數必須是正整數.", + "Volo.Abp.Identity:InvalidRoleName": "角色名 '{0}' 無效.", + "Volo.Abp.Identity:InvalidToken": "token無效.", + "Volo.Abp.Identity:InvalidUserName": "使用者名稱 '{0}' 無效, 只能包含字母或數字.", + "Volo.Abp.Identity:LoginAlreadyAssociated": "此登入名的使用者已存在.", + "Volo.Abp.Identity:PasswordMismatch": "密碼錯誤.", + "Volo.Abp.Identity:PasswordRequiresDigit": "密碼至少包含一位數字 ('0'-'9').", + "Volo.Abp.Identity:PasswordRequiresLower": "密碼至少包含一位小寫字母 ('a'-'z').", + "Volo.Abp.Identity:PasswordRequiresNonAlphanumeric": "密碼至少包含一位非字母數字字元.", + "Volo.Abp.Identity:PasswordRequiresUpper": "密碼至少包含一位大寫字母 ('A'-'Z').", + "Volo.Abp.Identity:PasswordTooShort": "密碼至少為{0}個字元.", + "Volo.Abp.Identity:RoleNotFound": "角色 {0} 不存在.", + "Volo.Abp.Identity:UserAlreadyHasPassword": "使用者已設置密碼.", + "Volo.Abp.Identity:UserAlreadyInRole": "使用者已具有角色 '{0}'.", + "Volo.Abp.Identity:UserLockedOut": "使用者被鎖定.", + "Volo.Abp.Identity:UserLockoutNotEnabled": "該使用者未啟用鎖定.", + "Volo.Abp.Identity:UserNameNotFound": "使用者 {0} 不存在.", + "Volo.Abp.Identity:UserNotInRole": "使用者不具有 '{0}' 角色.", + "Volo.Abp.Identity:PasswordConfirmationFailed": "密碼或確認密碼不一致.", + "Volo.Abp.Identity:010005": "無法重命名靜態角色.", + "Volo.Abp.Identity:010006": "無法刪除靜態角色.", + "Volo.Abp.Identity:010004": "組織內單位內已包含名稱 {0}.同一層級組織,兩個單位不能有相同名稱", "Identity.OrganizationUnit.MaxUserMembershipCount": "允許一個使用者至多可隸屬在幾個組織單位", "Volo.Abp.Identity:010001": "您無法刪除自己的帳號!", "Permission:IdentityManagement": "身份識別管理", @@ -73,35 +73,6 @@ "Permission:Delete": "刪除", "Permission:ChangePermissions": "更改權限", "Permission:UserManagement": "使用者管理", - "Permission:UserLookup": "使用者查詢", - "DisplayName:Abp.Identity.Password.RequiredLength": "要求長度", - "DisplayName:Abp.Identity.Password.RequiredUniqueChars": "要求唯一字元數量", - "DisplayName:Abp.Identity.Password.RequireNonAlphanumeric": "要求非字母數字", - "DisplayName:Abp.Identity.Password.RequireLowercase": "要求小寫字母", - "DisplayName:Abp.Identity.Password.RequireUppercase": "要求大寫字母", - "DisplayName:Abp.Identity.Password.RequireDigit": "要求數字", - "DisplayName:Abp.Identity.Lockout.AllowedForNewUsers": "允許新使用者", - "DisplayName:Abp.Identity.Lockout.LockoutDuration": "鎖定時間(秒)", - "DisplayName:Abp.Identity.Lockout.MaxFailedAccessAttempts": "最大失敗存取嘗試次數", - "DisplayName:Abp.Identity.SignIn.RequireConfirmedEmail": "要求驗證的電子信箱", - "DisplayName:Abp.Identity.SignIn.EnablePhoneNumberConfirmation": "啟用手機號碼驗證", - "DisplayName:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "要求驗證的手機號碼", - "DisplayName:Abp.Identity.User.IsUserNameUpdateEnabled": "啟用使用者名稱更新", - "DisplayName:Abp.Identity.User.IsEmailUpdateEnabled": "啟用電子信箱更新", - "Description:Abp.Identity.Password.RequiredLength": "密碼的最小長度.", - "Description:Abp.Identity.Password.RequiredUniqueChars": "密碼必須包含唯一字元的數量.", - "Description:Abp.Identity.Password.RequireNonAlphanumeric": "密碼是否必須包含非字母數字.", - "Description:Abp.Identity.Password.RequireLowercase": "密碼是否必須包含小寫字母.", - "Description:Abp.Identity.Password.RequireUppercase": "密碼是否必須包含大小字母.", - "Description:Abp.Identity.Password.RequireDigit": "密碼是否必須包含數字.", - "Description:Abp.Identity.Lockout.AllowedForNewUsers": "允許新使用者被鎖定.", - "Description:Abp.Identity.Lockout.LockoutDuration": "當鎖定發生時使用者被鎖定的時間(秒).", - "Description:Abp.Identity.Lockout.MaxFailedAccessAttempts": "如果啟用鎖定,當使用者被鎖定前失敗的存取嘗試次數.", - "Description:Abp.Identity.SignIn.RequireConfirmedEmail": "登入時是否需要驗證電子信箱.", - "Description:Abp.Identity.SignIn.EnablePhoneNumberConfirmation": "使用者手機號碼是否需要驗證.", - "Description:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "登入時是否需要驗證手機號碼.", - "Description:Abp.Identity.User.IsUserNameUpdateEnabled": "是否允許使用者更新使用者名稱.", - "Description:Abp.Identity.User.IsEmailUpdateEnabled": "是否允許使用者更新電子信箱.", - "Volo.Abp.Identity:010002": "一個使用者不能設置超過 {MaxUserMembershipCount} 個組織單位下" + "Permission:UserLookup": "使用者查詢" } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleManager.cs index 9c2a80a807..d2f2cb4a69 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleManager.cs @@ -29,10 +29,10 @@ namespace Volo.Abp.Identity IStringLocalizer localizer, ICancellationTokenProvider cancellationTokenProvider) : base( - store, - roleValidators, - keyNormalizer, - errors, + store, + roleValidators, + keyNormalizer, + errors, logger) { Localizer = localizer; @@ -54,7 +54,7 @@ namespace Volo.Abp.Identity { if (role.IsStatic && role.Name != name) { - throw new BusinessException(Localizer["Identity.StaticRoleRenamingErrorMessage"]); // TODO: localize & change exception type + throw new BusinessException("Volo.Abp.Identity:010005"); } return await base.SetRoleNameAsync(role, name); @@ -64,7 +64,7 @@ namespace Volo.Abp.Identity { if (role.IsStatic) { - throw new BusinessException(Localizer["Identity.StaticRoleDeletionErrorMessage"]); // TODO: localize & change exception type + throw new BusinessException("Volo.Abp.Identity:010006"); } return await base.DeleteAsync(role); diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/OrganizationUnitManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/OrganizationUnitManager.cs index 4706f92428..d03e56af79 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/OrganizationUnitManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/OrganizationUnitManager.cs @@ -131,7 +131,8 @@ namespace Volo.Abp.Identity if (siblings.Any(ou => ou.DisplayName == organizationUnit.DisplayName)) { - throw new UserFriendlyException(Localizer["Identity.OrganizationUnit.DuplicateDisplayNameWarning", organizationUnit.DisplayName]); + throw new BusinessException("Volo.Abp.Identity:010004") + .WithData("0", organizationUnit.DisplayName); } } From 8c0e0b08ce8a8c005f1341efccb7904167131c62 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Mon, 7 Sep 2020 16:55:13 +0300 Subject: [PATCH 076/116] improve IdentityErrorCodes --- .../Volo/Abp/Identity/IdentityErrorCodes.cs | 3 +++ .../Volo/Abp/Identity/IdentityRoleManager.cs | 4 ++-- .../Volo/Abp/Identity/OrganizationUnitManager.cs | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityErrorCodes.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityErrorCodes.cs index d5e57a6953..1defe67eeb 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityErrorCodes.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityErrorCodes.cs @@ -5,5 +5,8 @@ public const string UserSelfDeletion = "Volo.Abp.Identity:010001"; public const string MaxAllowedOuMembership = "Volo.Abp.Identity:010002"; public const string ExternalUserPasswordChange = "Volo.Abp.Identity:010003"; + public const string DuplicateOrganizationUnitDisplayName = "Volo.Abp.Identity:010004"; + public const string StaticRoleRenaming = "Volo.Abp.Identity:010005"; + public const string StaticRoleDeletion = "Volo.Abp.Identity:010006"; } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleManager.cs index d2f2cb4a69..40c249e5c4 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleManager.cs @@ -54,7 +54,7 @@ namespace Volo.Abp.Identity { if (role.IsStatic && role.Name != name) { - throw new BusinessException("Volo.Abp.Identity:010005"); + throw new BusinessException(IdentityErrorCodes.StaticRoleRenaming); } return await base.SetRoleNameAsync(role, name); @@ -64,7 +64,7 @@ namespace Volo.Abp.Identity { if (role.IsStatic) { - throw new BusinessException("Volo.Abp.Identity:010006"); + throw new BusinessException(IdentityErrorCodes.StaticRoleDeletion); } return await base.DeleteAsync(role); diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/OrganizationUnitManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/OrganizationUnitManager.cs index d03e56af79..ec794a51df 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/OrganizationUnitManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/OrganizationUnitManager.cs @@ -131,7 +131,7 @@ namespace Volo.Abp.Identity if (siblings.Any(ou => ou.DisplayName == organizationUnit.DisplayName)) { - throw new BusinessException("Volo.Abp.Identity:010004") + throw new BusinessException(IdentityErrorCodes.DuplicateOrganizationUnitDisplayName) .WithData("0", organizationUnit.DisplayName); } } From dfd2baee7f8ad0fef68eff134014447084555c2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 7 Sep 2020 17:25:44 +0300 Subject: [PATCH 077/116] Stared to document the feature system --- docs/en/Features.md | 46 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/docs/en/Features.md b/docs/en/Features.md index 4b31ca16e9..d5262c6cdb 100644 --- a/docs/en/Features.md +++ b/docs/en/Features.md @@ -1,3 +1,47 @@ # Features -TODO \ No newline at end of file +ABP Feature system is used to **enable**, **disable** or **change the behavior** of the application features **on runtime**. + +Feature system was originally designed to control the tenant features in a **multi-tenant** application. However, it is **extensible** and capable of determining features by any condition. + +> The feature system is implemented with the [Volo.Abp.Features](https://www.nuget.org/packages/Volo.Abp.Features) NuGet package. Most of the times you don't need to manually [install it](https://abp.io/package-detail/Volo.Abp.Features) since it comes pre-installed with the [application startup template](Startup-Templates/Application.md). + +## Checking for the Features + +Before starting to explain how to define features, let's see how to check a feature in your application code. + +### RequiresFeature Attribute + +`[RequiresFeature]` attribute (defined in the `Volo.Abp.Features` namespace) is used to declaratively check if a feature is enabled or not. + +**Example: Check if the current user/tenant has "PDF Reporting" feature enabled** + +```csharp +public class ReportingAppService : ApplicationService, IReportingAppService +{ + public async Task GetCsvReportAsync() + { + throw new System.NotImplementedException(); + } + + [RequiresFeature("MyApp.PdfReporting")] + public async Task GetPdfReportAsync() + { + throw new System.NotImplementedException(); + } +} +``` + +* `RequiresFeature(...)` simply gets a feature name to check if it is enabled or not. If not enabled, an authorization [exception](Exception-Handling.md) is thrown and a proper response is returned to the client side. +* `[RequiresFeature]` can be used for a **method** or a **class**. When you use it for a class, all the +* `RequiresFeature` may get multiple feature names, like `[RequiresFeature("Feature1", "Feature2")]`. In this case ABP checks if current user/tenant has any of the features enabled. Use `[RequiresFeature("Feature1", "Feature2", RequiresAll = true)]` to force to allow only if all of the features are enabled. +* Multiple usage of `[RequiresFeature]` attribute is enabled, so it checks all of them. + +#### About the Interception + +ABP Framework uses the interception system to make the `[RequiresFeature]` attribute working. So, it can work with any class that is injected from the [dependency injection](Dependency-Injection.md). + +However, there are **some rules should be followed** in order to make it working; + +* If you are **not injecting** the service over an interface (like `IMyService`), then the methods of the service must be `virtual` (otherwise, [dynamic proxy / interception](Dynamic-Proxying-Interceptors.md) system can not work). +* Only `async` methods (methods returning a `Task` or `Task`) are intercepted. From 735a0c2db68c054ad456afe4f6231317191bb5d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 7 Sep 2020 18:11:10 +0300 Subject: [PATCH 078/116] Update Features.md --- docs/en/Features.md | 115 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 103 insertions(+), 12 deletions(-) diff --git a/docs/en/Features.md b/docs/en/Features.md index d5262c6cdb..2c859d643f 100644 --- a/docs/en/Features.md +++ b/docs/en/Features.md @@ -2,6 +2,8 @@ ABP Feature system is used to **enable**, **disable** or **change the behavior** of the application features **on runtime**. +The runtime value for a feature can simply be a `boolean`, like enabled (`true`) or disabled (`false`). However, you can store **any kind** of runtime value for feature. + Feature system was originally designed to control the tenant features in a **multi-tenant** application. However, it is **extensible** and capable of determining features by any condition. > The feature system is implemented with the [Volo.Abp.Features](https://www.nuget.org/packages/Volo.Abp.Features) NuGet package. Most of the times you don't need to manually [install it](https://abp.io/package-detail/Volo.Abp.Features) since it comes pre-installed with the [application startup template](Startup-Templates/Application.md). @@ -12,36 +14,125 @@ Before starting to explain how to define features, let's see how to check a feat ### RequiresFeature Attribute -`[RequiresFeature]` attribute (defined in the `Volo.Abp.Features` namespace) is used to declaratively check if a feature is enabled or not. +`[RequiresFeature]` attribute (defined in the `Volo.Abp.Features` namespace) is used to declaratively check if a feature is enabled or not. It is a useful shortcut for the `boolean` features. -**Example: Check if the current user/tenant has "PDF Reporting" feature enabled** +**Example: Check if the "PDF Reporting" feature enabled** ```csharp public class ReportingAppService : ApplicationService, IReportingAppService { - public async Task GetCsvReportAsync() - { - throw new System.NotImplementedException(); - } - [RequiresFeature("MyApp.PdfReporting")] public async Task GetPdfReportAsync() { - throw new System.NotImplementedException(); + //TODO... } } ``` * `RequiresFeature(...)` simply gets a feature name to check if it is enabled or not. If not enabled, an authorization [exception](Exception-Handling.md) is thrown and a proper response is returned to the client side. -* `[RequiresFeature]` can be used for a **method** or a **class**. When you use it for a class, all the -* `RequiresFeature` may get multiple feature names, like `[RequiresFeature("Feature1", "Feature2")]`. In this case ABP checks if current user/tenant has any of the features enabled. Use `[RequiresFeature("Feature1", "Feature2", RequiresAll = true)]` to force to allow only if all of the features are enabled. -* Multiple usage of `[RequiresFeature]` attribute is enabled, so it checks all of them. +* `[RequiresFeature]` can be used for a **method** or a **class**. When you use it for a class, all the methods of that class require the given feature. +* `RequiresFeature` may get multiple feature names, like `[RequiresFeature("Feature1", "Feature2")]`. In this case ABP checks if any of the features enabled. Use `RequiresAll` option, like `[RequiresFeature("Feature1", "Feature2", RequiresAll = true)]` to force to check all of the features to be enabled. +* Multiple usage of `[RequiresFeature]` attribute is supported for a method or class. ABP check checks all of them in that case. + +> Feature name can be any arbitrary string. It should be unique for a feature. #### About the Interception -ABP Framework uses the interception system to make the `[RequiresFeature]` attribute working. So, it can work with any class that is injected from the [dependency injection](Dependency-Injection.md). +ABP Framework uses the interception system to make the `[RequiresFeature]` attribute working. So, it can work with any class (application services, controllers...) that is injected from the [dependency injection](Dependency-Injection.md). However, there are **some rules should be followed** in order to make it working; * If you are **not injecting** the service over an interface (like `IMyService`), then the methods of the service must be `virtual` (otherwise, [dynamic proxy / interception](Dynamic-Proxying-Interceptors.md) system can not work). * Only `async` methods (methods returning a `Task` or `Task`) are intercepted. + +> There is an exception for the controllers and razor pages. They don't require the following rules since ABP Framework uses action/page filters to implement the feature checking in this case. + +### IFeatureChecker Service + +`IFeatureChecker` allows to check a feature in your application code. + +#### IsEnabledAsync + +Returns `true` if the given feature is enabled. So, you can conditionally execute your business flow. + +**Example: Check if the "PDF Reporting" feature enabled** + +```csharp +public class ReportingAppService : ApplicationService, IReportingAppService +{ + private readonly IFeatureChecker _featureChecker; + + public ReportingAppService(IFeatureChecker featureChecker) + { + _featureChecker = featureChecker; + } + + public async Task GetPdfReportAsync() + { + if (await _featureChecker.IsEnabledAsync("MyApp.PdfReporting")) + { + //TODO... + } + else + { + //TODO... + } + } +} +``` + +`IsEnabledAsync` has overloads to check multiple features in one method call. + +#### GetOrNullAsync + +Gets the current value for a feature. This method returns a `string`, so you store any kind of value inside it, by converting to or from `string`. + +**Example: Check the maximum product count allowed** + +```csharp +public class ProductController : AbpController +{ + private readonly IFeatureChecker _featureChecker; + + public ProductController(IFeatureChecker featureChecker) + { + _featureChecker = featureChecker; + } + + public async Task Create(CreateProductModel model) + { + var currentProductCount = await GetCurrentProductCountFromDatabase(); + + //GET THE FEATURE VALUE + var maxProductCountLimit = + await _featureChecker.GetOrNullAsync("MyApp.MaxProductCount"); + + if (currentProductCount >= Convert.ToInt32(maxProductCountLimit)) + { + throw new BusinessException( + "MyApp:ReachToMaxProductCountLimit", + $"You can not create more than {maxProductCountLimit} products!" + ); + } + + //TODO: Create the product in the database... + } + + private async Task GetCurrentProductCountFromDatabase() + { + throw new System.NotImplementedException(); + } +} +``` + +In this way, you can create numeric limits in your SaaS application depending on the current user or tenant. + +Instead of manually converting the value to `int`, you can use the generic overload of the `GetAsync` method: + +```csharp +var maxProductCountLimit = await _featureChecker.GetAsync("MyApp.MaxProductCount"); +``` + +#### Extension Methods + +TODO \ No newline at end of file From 460686a22d003e0475a62402d3f56b5e015e819f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 7 Sep 2020 20:46:43 +0300 Subject: [PATCH 079/116] Added empty sections to the features document --- docs/en/Features.md | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/docs/en/Features.md b/docs/en/Features.md index 2c859d643f..82d1790b9e 100644 --- a/docs/en/Features.md +++ b/docs/en/Features.md @@ -2,19 +2,19 @@ ABP Feature system is used to **enable**, **disable** or **change the behavior** of the application features **on runtime**. -The runtime value for a feature can simply be a `boolean`, like enabled (`true`) or disabled (`false`). However, you can store **any kind** of runtime value for feature. +The runtime value for a feature is generally a `boolean` value, like `true` (enabled) or `false` (disabled). However, you can get/set **any kind** of value for feature. -Feature system was originally designed to control the tenant features in a **multi-tenant** application. However, it is **extensible** and capable of determining features by any condition. +Feature system was originally designed to control the tenant features in a **multi-tenant** application. However, it is **extensible** and capable of determining the features by any condition. > The feature system is implemented with the [Volo.Abp.Features](https://www.nuget.org/packages/Volo.Abp.Features) NuGet package. Most of the times you don't need to manually [install it](https://abp.io/package-detail/Volo.Abp.Features) since it comes pre-installed with the [application startup template](Startup-Templates/Application.md). ## Checking for the Features -Before starting to explain how to define features, let's see how to check a feature in your application code. +Before explaining to define features, let's see how to check a feature value in your application code. ### RequiresFeature Attribute -`[RequiresFeature]` attribute (defined in the `Volo.Abp.Features` namespace) is used to declaratively check if a feature is enabled or not. It is a useful shortcut for the `boolean` features. +`[RequiresFeature]` attribute (defined in the `Volo.Abp.Features` namespace) is used to declaratively check if a feature is `true` (enabled) or not. It is a useful shortcut for the `boolean` features. **Example: Check if the "PDF Reporting" feature enabled** @@ -42,10 +42,10 @@ ABP Framework uses the interception system to make the `[RequiresFeature]` attri However, there are **some rules should be followed** in order to make it working; -* If you are **not injecting** the service over an interface (like `IMyService`), then the methods of the service must be `virtual` (otherwise, [dynamic proxy / interception](Dynamic-Proxying-Interceptors.md) system can not work). +* If you are **not injecting** the service over an interface (like `IMyService`), then the methods of the service must be `virtual`. Otherwise, [dynamic proxy / interception](Dynamic-Proxying-Interceptors.md) system can not work. * Only `async` methods (methods returning a `Task` or `Task`) are intercepted. -> There is an exception for the controllers and razor pages. They don't require the following rules since ABP Framework uses action/page filters to implement the feature checking in this case. +> There is an exception for the **controller and razor page methods**. They **don't require** the following the rules above, since ABP Framework uses the action/page filters to implement the feature checking in this case. ### IFeatureChecker Service @@ -125,7 +125,7 @@ public class ProductController : AbpController } ``` -In this way, you can create numeric limits in your SaaS application depending on the current user or tenant. +This example uses a numeric value as a feature limit product counts for a user/tenant in a SaaS application. Instead of manually converting the value to `int`, you can use the generic overload of the `GetAsync` method: @@ -135,4 +135,27 @@ var maxProductCountLimit = await _featureChecker.GetAsync("MyApp.MaxProduct #### Extension Methods +There are some useful extension methods for the `IFeatureChecker` interface; + +* `Task GetAsync(string name, T defaultValue = default)`: Used to get a value of a feature with the given type `T`. Allows to specify a `defaultValue` that is returned when the feature value is `null`. +* `CheckEnabledAsync(string name)`: Checks if given feature is enabled. Throws an `AbpAuthorizationException` if the feature was not `true` (enabled). + +## Defining the Features + +TODO + +## Feature Management + +TODO + +## Advanced Topics + +TODO + +### Feature Value Providers + +TODO + +### Feature Store + TODO \ No newline at end of file From 60a54bc9f126cad6ce7f3a15200cf0e0c9f95c70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 7 Sep 2020 21:37:55 +0300 Subject: [PATCH 080/116] Added section: Defining the Features. --- docs/en/Features.md | 125 ++++++++++++++++++++++++++++- docs/en/images/features-action.png | Bin 0 -> 16742 bytes docs/en/images/features-modal.png | Bin 0 -> 35412 bytes 3 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 docs/en/images/features-action.png create mode 100644 docs/en/images/features-modal.png diff --git a/docs/en/Features.md b/docs/en/Features.md index 82d1790b9e..e125f16f08 100644 --- a/docs/en/Features.md +++ b/docs/en/Features.md @@ -4,7 +4,7 @@ ABP Feature system is used to **enable**, **disable** or **change the behavior** The runtime value for a feature is generally a `boolean` value, like `true` (enabled) or `false` (disabled). However, you can get/set **any kind** of value for feature. -Feature system was originally designed to control the tenant features in a **multi-tenant** application. However, it is **extensible** and capable of determining the features by any condition. +Feature system was originally designed to control the tenant features in a **[multi-tenant](Multi-Tenancy.md)** application. However, it is **extensible** and capable of determining the features by any condition. > The feature system is implemented with the [Volo.Abp.Features](https://www.nuget.org/packages/Volo.Abp.Features) NuGet package. Most of the times you don't need to manually [install it](https://abp.io/package-detail/Volo.Abp.Features) since it comes pre-installed with the [application startup template](Startup-Templates/Application.md). @@ -142,6 +142,129 @@ There are some useful extension methods for the `IFeatureChecker` interface; ## Defining the Features +A feature should be defined to be able to check it. + +### FeatureDefinitionProvider + +Create a class inheriting the `FeatureDefinitionProvider` to define permissions. + +**Example: Defining permissions** + +```csharp +using Volo.Abp.Features; + +namespace FeaturesDemo +{ + public class MyFeatureDefinitionProvider : FeatureDefinitionProvider + { + public override void Define(IFeatureDefinitionContext context) + { + var myGroup = context.AddGroup("MyApp"); + + myGroup.AddFeature("MyApp.PdfReporting", defaultValue: "false"); + myGroup.AddFeature("MyApp.MaxProductCount", defaultValue: "10"); + } + } +} +``` + +> ABP automatically discovers this class and registers the features. No additional configuration required. + +* In the `Define` method, you first need to add a **feature group** for your application/module or get an existing group then add **features** to this group. +* First feature, named `MyApp.PdfReporting`, is a `boolean` feature with `false` as the default value. +* Second feature, named `MyApp.MaxProductCount`, is a numeric feature with `10` as the default value. + +### Other Feature Properties + +While these minimal definitions are enough to make the feature system working, you can specify the **optional properties** for the features; + +* `DisplayName`: A localizable string that will be used to show the feature name on the user interface. +* `Description`: A longer localizable text to describe the feature. +* `ValueType`: Type of the feature value. Can be a class implementing the `IStringValueType`. Built-in types: + * `ToggleStringValueType`: Used to define `true`/`false`, `on`/`off`, `enabled`/`disabled` style features. A checkbox is shown on the UI. + * `FreeTextStringValueType`: Used to define free text values. A textbox is shown on the UI. + * `SelectionStringValueType`: Used to force the value to be selected from a list. A dropdown list is shown on the UI. +* `IsVisibleToClients` (default: `true`): Set false to hide the value of this feature from clients (browsers). Sharing the value with the clients helps them to conditionally show/hide/change the UI parts based on the feature value. +* `Properties`: A dictionary to set/get arbitrary key-value pairs related to this feature. This can be a point for customization. + +So, based on these descriptions, it would be better to define these features as shown below: + +```csharp +using FeaturesDemo.Localization; +using Volo.Abp.Features; +using Volo.Abp.Localization; +using Volo.Abp.Validation.StringValues; + +namespace FeaturesDemo +{ + public class MyFeatureDefinitionProvider : FeatureDefinitionProvider + { + public override void Define(IFeatureDefinitionContext context) + { + var myGroup = context.AddGroup("MyApp"); + + myGroup.AddFeature( + "MyApp.PdfReporting", + defaultValue: "false", + displayName: LocalizableString + .Create("PdfReporting"), + valueType: new ToggleStringValueType() + ); + + myGroup.AddFeature( + "MyApp.MaxProductCount", + defaultValue: "10", + displayName: LocalizableString + .Create("MaxProductCount"), + valueType: new FreeTextStringValueType( + new NumericValueValidator(0, 1000000)) + ); + } + } +} + +``` + +* `FeaturesDemoResource` is the project name in this example code. See the [localization document](Localization.md) for details about the localization system. +* First feature is set to `ToggleStringValueType`, while the second one is set to `FreeTextStringValueType` with a numeric validator that allows to the values from `0` to `1,000,000`. + +Remember to define the localization the keys in your localization file: + +````json +"PdfReporting": "PDF Reporting", +"MaxProductCount": "Maximum number of products" +```` + +See the [localization document](Localization.md) for details about the localization system. + +### Feature Management Modal + +The [application startup template](Startup-Templates/Application.md) comes with the [tenant management](Modules/Tenant-Management.md) and the [feature management](Modules/Feature-Management.md) modules pre-installed. + +Whenever you define a new feature, it will be available on the **feature management modal**. To open this modal, navigate to the **tenant management page** and select the `Features` action for a tenant (create a new tenant if there is no tenant yet): + +![features-action](images/features-action.png) + +This action opens a modal to manage the feature values for the selected tenant: + +![features-modal](images/features-modal.png) + +So, you can enable, disable and set values for a tenant. These values will be used whenever a user of this tenant uses the application. + +See the *Feature Management* section below to learn more about managing the features. + +### Child Features + +A feature may have child features. This is especially useful if you want to create a feature that is selectable only if another feature was enabled. + +TODO + +### Changing Features Definitions of a Depended Module + +TODO + +### Check a Permission in the Client Side + TODO ## Feature Management diff --git a/docs/en/images/features-action.png b/docs/en/images/features-action.png new file mode 100644 index 0000000000000000000000000000000000000000..8283a95be946232016b65a63f47c211424c6ba54 GIT binary patch literal 16742 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�UfiA=i< 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 literal 0 HcmV?d00001 diff --git a/docs/en/images/features-modal.png b/docs/en/images/features-modal.png new file mode 100644 index 0000000000000000000000000000000000000000..74ee8aabc33189a420f3205ddc0c90215e5767c9 GIT binary patch literal 35412 zcmc$_Wl$V#)Gazl@BksWlMvip1Hs(~4el<%-CcqNcLD?_xD!Hv06{0X2OVs1A2`i> z&iD6L-Kr}TR5w!(&7*s-wf5>5H5J*H7^D~=5a^}6oRkI#gcJ?}A=IED0-yBZvUUO& zbQd|jPaqKH>*pT?P;-kblXv{Uw?P6dKWI) z@=rkJAFYZ-$~}?}+rb~%2G#($Qi_f)A{tFNt^}GTVk#7o`uVP?ktkCA`GzKqlUU{z za1B=*G$EG$uN_I4DgOU%kM;j?qm1Y7O}^r&9=7=F%7QS7&qzwdFy@{Nbo3=JRtZ|s zhMco2{+17`jOZvAGBwG|!wN@j&V)DNlO(&*rfH_cNkcUdD9SQfj8w_g9wYON%MeHW z($PPk$ImrsmDzN$X0&)SJgkz^l6y*ptsSF^XD>VQ1Em^>9Z#C8Na=tX5kjKij6V|* z^Rx0u9}2i(Q-BVR8MHdAcrsz~RYTo7vbf83y&LbHzT)###uO7{L>%msk&==QSa4~+ zliG`m+rW~J@Cit&?YFci2zF1}$Q=F%V364i^$*~qdKw_FU(=SZ&T zD`$?!F7+kzUOt|ftjS&Fn`H<20mJFL|ETj@o+q&<>v$)Z}4MA!i3&R}uSGTQDo@n}ed=#BK{VgEg zEG;cv&)cSQVKXWJWS2?^;)1PXn|@wDX6NT=?j7YD`atwm4ej@#^wS}RsKv3qhnrDR=HcoJ(8ugW z<($_1{AtjSCdSmbI1HS>v&pG9M!9^=moE=yot4CRh%ea6?cE2yrKA)ulf!(@$9=BD zaB#|IN{Z7olpzeFkigbSbWMUtQ=Y=gH`k+RX}A)^k-^0l9KUkk#3$Crc*A6q=?2Wv zBg(Ex+!`8Kgg6Ngj-QGzids9o6LCkfF7MP>xH3CqCEloj_0qq*9y2%N`AYy|BvfEJ zTYrq#4l_iMSABE()vbC0E0JF)uSJTMm`LSVSVgz0-*)GhXV6`M{7d8xDGI4gd1;d4 zpr;Z@qz!35MsK+JCtzY44y;f`8w+(7IN8wOG8Nq?cFM z-uf`7_loYa_BP@-A-!a>+4r`5+ERA4?mZ6j9~TjiA6^Yu*c%x5$;yJ~_Mnh5fxJXp zO}e^|%{!UkuIw_XfRp}ZJQPx%P+Kjcp=0RoX{y&ag%+EOn+jjmLNisedTpa1LSt3t zP>wrA7T?8YC@mjhBa(+BXyp9&fC2m(U0wJe{hN(T6wwJa1@SLtp*)#6r13Hoim%Z> zP^9}P4IRAnRl!HT-8y?ile=IB;w4ec^$8j*ERu5X8u-Cn%s{?9(UV%nP5P2NHJ<+K zCT3gpfE}`O;?R9BKeimCX;5aZY%E8o#)u+eP&ZxlO3?VDenU|$A0$G+Ns>?|0R?H| zJe)?HCQB)Hm{yeK%YnO4n9)Q73vOYWg1kH~PGH)igLb5;yAU?WJ8#^n)jqqdQlEwJ zZFuIGRk|he2PMkISDJOZ2{I*RQ@SkaBmU$=dVj1iaN`CTO061WEcNtKUWa~W!>fak zV4*}>28R|ipnnh$Vdug!=OWchd>5{U(ZGTp>V1;-e}G<-Wc8XFh)QN>z^ zdh!~SxEU|=c9aWL$e_SN_(_mLtmitvs@Ls{Q61G5X5w?${xHpR)Hos53wuPpq7qmi zyIOQ?DIw2IOF5#T7;TZDmdoc;@7p zMwi*HtR%1aT^}t4i9;Pv&GcHT-G6;c-ge4}+x3wUhcvmg`7I^pHG5oUm%Wl;>sa@% znn@ArY5P{+_6-*l+Bey-4dZ0F-K%(y3M`wT@fx@5>;ZKjQmPOV_8jr^BF_(X)`S%!{0q_1Pb*VYE==l6o|&>`FU(S&EF}#Ebea-o zW(|4wmAiz_>thH{!sfgy7@SI5 zLBx@aEDUNhn|=f4-!uD7`E!&j66>)$YdU;?OcOSYD{naLXqX9D(LnPfHsaP#7v&A2>Fx5r6!IuXsTgUr+iN~A zg-WX?Z<$0Em))(V+qbg&)Dtdr%v2S13skRYBO$v41b!6Sbr6lY_uo$QlI5B<>P1M8 zk0~o@F@~^8!at*LR?@{+?dw#Rj;7P&p@;RU@mlfFSX}1^2>TgK5J<1I+k3g1e(?0v zRyQ?eikB&#Qq>MxyneHi{QD7!m)ly&OW@GA`@P^_O*c1kBDBc&#;qSxXhFEh$(9S8 zCCpeTlJ*AocQ46OQ;*WBWvP>BMP5Fu9ZZXENCqYRam(+ID0tf_hR0THAu zeOpQKYKRvP=p5S!xuyKPigM5Y1-w4j%-m9QDIC>iNA z+^`IVjf|XmFFWNWrs7b<$@=zi((+P9ZwiF%#hC1|Z>Bmc9j+!7w18S8qlY&r~p~-}ZZ^l1xd++;{Sv z+Di+Psx0fTasq7EFNw9HW1E7AXHt^GQc=|271n910OR@_@-`NBC6csN^g*bPu7A%$Ia+2|6MjV`8Qi9N6ned<535$ERZ<9 zRN-F>F4C7WAeVM>NSTTX)$2H!8p87!QQ2o^mKU$(*PRHt%v;^v;uH!vjn>GB(4l1{ zjPr_oK~3kZ;wrlBsm+}7H_L8WXx$=544)qsvj0{C{-XEHDc$cFV}-UF1+wyt$|G<*czByoG&h$oQM^2b;_1LIgE#K$ZU;H~ z1F*GR<=*-&%12CTS(M|m4L~L>3-9ksCjB$tC z)V3S8TlYH!+kKXNnAm=K`4V4-5yTOGaWp|a+K`ElPJ`Vk%FDzM zvDwzOockf2FIn!FnQOWwCgz!*RlVv*@C>jj6rG;sR%F}mL*qRt-GPHmj7H8am6bUy zPRcKz@Q{l-JIO!*)6_83`EOIm;Dynsm(}L}1Txt6TSeJ)LZ}whL{(M!vbBYtb_O~| zrDvpVWF+Kf;bU6MOR3_Yter+BL{A_iS>$4GfJ$RAvL!Dlxa!_uf#xc3_(@3L3m@pl96sKguV?lJ^Yo)`)VRpO4_#g4&Jzi`=@eiiz8elE zG_!ybRY=pTw+a9_RZ23Y2U#`R{>fCx7)1w#i+>2rFP$iS6KSgPDMF#aJq^5rPD7Vk z@vYuvBh-hWM8+<=#qnOH0A|t{sO;EX%;3{5Xg(A_C=&a8b}Ld&T_nvvF|Z+yHiU=6 z9edKnMUrt-MDsK)i#l7%ir!AvAoRPEe|ep7`7&?ATO|2&TE0}J+_1OA=R0H^g=VQY zG|^E_lOrj_s%Q!m>RPzrZPZuVaNA-A+FurHClb6&w0P*Qd)Aynrt~vPb+(JZsr;xC zHDjmOwBD6IJ1a-~lcRdf?$WmrA6!#Wp^O;bzf$Dll|Cd20LzE2k00=Bv=u)X8L?1` ziKOzjHYbql?YIezXK@RYAD5*$Eq&Ka`MTI~_v+m{U`kfoKV@edNU6IE<@&U*>ay&( z2%zY#ci&%adp80SLZ!75GaDO5q(pXEmh#RaOVWT@AS^5i1PWHl@J3~=(% zgQm&9#=ty-Ke9=KE#%$ilgv%&pQGbTKORc-8Ch(-jq@Kpl9UQ&)eCdZ`j8g6HdZ+G z>}*%-(dU(hv})1%-nE3#$H+o4xLS1`R5)JtVrK4wIg5!NN0jbd#WQl$gyCW%R<*KR z^|WoJ^sR!1M|y1K;O1$-JCS&)dB!uGcn5`1k(=pl$8O2=+o}_vDb%! zx{9JH9W7lojgQC!>#+UB@Amwl8@M4EpJP6cYuAh!i6JKjC?!S9K!+-Bs9ZT~xmQ<~ z8tq?pbAf6WPtmvfLTa(PdTJ_=ma<~3nWJGqp_ksg4bQ%3`^c!wMLc}2$(yCedhKz= z@9K(78Rjxif$g_%uTW80`Q5v#rY2x6zuV9-B+x6va=X!kEM?e24~pjOsh!AA26_k- zn@xH14DPC>&oC5GmirnUjGPjUCQ!pROc;39IRkLU$49ubu)=W_07i@w`r(6s#jlPj zo8NAJ-bS(r|DHj7>D+m{pkSKa7;8pM0mlT8oyPzmFLx~PER`#UpaXzXTvK?)TpGO({=IMYcNX+@MONj^>i0DG+ zropQR*6a%6!*l5xd*Si->p;z^~6r zm~N>$Me+2Q6a?QME`O&Ncos7R^wKN#`1zUfO@7zMN$>A~1^R$X$ZnLIlasS5&3Jk1 z@7xP-S%cvqBLdN~txX_ITDlxNa*7+H4x*gH)!xwXuW5x7FGjAxf6*xlc#zV+Q}0}r za)#KNni}Vx+noU- zusPb>+dDfOceq3U4aA+FpC23?tOed5sWC_aT#l*ZuwnGj)9-%wG;i z_6WBuEmeHHXRn&U02#D8KFxadkR=WE1{{nTcV1<$JwZ>C-apQpdOaMK?kXz8B2eRF z_ulQ>!+M_jdf=#1>VL*Zvbij$9oITa?GESNGdz_c04#!!tUa~cj;8PI5Gq3ebt3$9 zld26y>9Fttt;m%5i|m^J`B+O!%lPc13Hl^?l0NE`+Ki+fUnb)$g2~8 zY+!pg!(mU(+w@gvG}uuqR*ftQ&cU|bDdUGD|U48go{B_iBB zePWpj2GSXc4Hq4qLYPd|Oy%4;XmWAU7ZxCP%FEksSnGG(bMPRINdSh=^%@84XYJ0` ztes4c)-8X!#sR`0NEsrdqy5ouY^Kp_{Lk>|p!w+>Fq>XMH<}`pL3iy$Whz5!BOH=xpQgvD@k>xeW6IFdhEh-K&ah?OV-rMhE-*3Xa2LW8D|iikva|FFE4# zfh=%b7qD5@W1yQJ@Q~E|boL?+w7%U7FPWPA)d1AR;OisIY>Le-Yrf~oyu7^5JL9-x6;RMgP{sQpq<0UCmYx(b9FT^1Bj z1r!Y_@A3I9m!XjRi0RlK$$$-y(WgtWo}M0*HT*N6C4q3Uy;_@^5Q7+$-ky&>Dl`UM0%UnCD$qJa9q+I zJ3G5o--8-0JXTiLJYlcnSORAM_r@H=9~&%&w=;|rH`OK_o)3;p*aowX5$C!{Ns)_g zx+TcQ$u{6|AOl6j5DW%=riD(eJ)M^JJ|<`Ypkx;iB#n%ATsy_?ya#qz4ODG!yN#UJ zEEQ8z(qexWGdv!M)nR+b7Bhgv(Qa40oLlv4CPc0!1jtw0Y|jUka|(Q~ZaZOjeWh{i zR(cKy;y~c4Y-#a?PM1#E;DZzt71?_q+^S~mT9=H2;Fka}bP;&yeS*VAnCpIt_@ZpG z={9jdECs4Oyu5@d%FT~?${|G%D86)-faycP^b5>MZ>(%b<3b-+~m0KYu>J@9iau)YMHwyb4WFMT;7>)$yxlgd9iG+(k=SMiUa0 zk#b$a3Q8!IR#k=5bSa9Z0i> z$7MyrsrN&cbpcFR_iRr$J&)V31=tkG8|_5Kb|Ot=e!$NC?gp;34`GNcQe!X#NksDx zD1J(7&cdbj^-Z6A(jQ`^WIQwI^j_v9yL@544b&W1=p zxOk-4?NpJ#&-Gn*nY_W=i_3$$dz*og#l;RHV_%=qSx3zAoQ#|t=GcFcFUiEso)RD23<#8wRqOebpk2b62{`yo=ZWI2d~xpTrhFoMJvzVb+U)#y72gjNhp%)vy8bLip(DOrG*|I>KHZk{y{>HB+s!;*~;02O2HDYZZwoRG)oQMuxD zu(#*GS<||>xG0#I$7?UM23C3wSj^Z_=Kp@h$S&G*5YwsVi~MS(Med)d|H+9w=77 zVz198e|C0GMo)9~8n5+4K5uQM-FZ4IfP^QyPu_q;&Q93Nl=3Z_b)9;T4Bi8ruHEwK z5eY~ZAP|t-o&xVu#h$jIeNpPE!|vC4Ye@tDfCM=`IeD{;i5g`Dy?po@^LpBu;ojbE z)^Yykry_ef4hLxhk+J*6Ty1x{$rwO3ij1&KIUcZ>$pcla32C;X;cTc00IK9~?WzV8 z7>WSi@e0kdhsy|Sv4_1)RqeXd+iWyRjI;A{rF@=7UzwSC&I)q}?Sl!*wxF|LF|eQ; zby-{m55Y;{Or0|Nk5+k^hgmX1vk@ zc;Hmx`&2wzfQX52{1F)F9?uj{rLBIMqU+9^iXh)7vha|88>ZmON+!jWGIfPhKhMhO z;^1Dq=P9#&3wQ}$O}I0T>xSb}hg%Zo&y|y|Cy~gbqLoz8R{m~a8TIYXx73qBA#j*N z|4bWWxuBHsTn-g7$W)@Mn#qQ0L8{Od$wUd&$c0< zmnTTq7lmoS|L2IWWFnuU=q`Hv%(2LA6ayG31deUYb0%>W6x<{~`IRX?*GTei@ui2| zUyT!Hmwjics$?2ZiTTL$d6GW!~kb$NRkB|9tsZfn)=aTh%y>xEF@J6}H)?H2< zvcd_50oz;^c8TcxIm-_G|F%+6Uu6q~jesR-+StuGkn|t>kNm|M_HOq7o+j{O?>}{uP@VCceil*s>UrK>R6qe>!&^|h(qm3P+Mrpk!p6oV z^wN^p4V`9cdHRjKMq;H^2g`r!VXP$(4B%_v0hWJUKIVXN!*_PlWsEgh2q6cTFJ9aZ z3`p};@dk*ub@~CI-%_59i78XWR)Yb*vZBV`8ActxwYv+BC$;6HnqFofRRFqWZ;-PF zBSKEzz0DJv-B1W19bIa4kOqFvvhMaa^`#0n$ zmZzs1Tp@(&_yp1@!GQS3zv_<(0y10H47bLRRPhwhG2ly=r4|BRcG7`Hzgk$(o6r7l zC;gqP$1I`9%d64}T7+I}E^>E^8wPayWdN{C@5SwH1#1IKYpWM+s(jqc^yK`_a3$}l zw@CBo++Qu7HJ83(_R`J*g_H|`^9Lv^#}5@iiI>fZwi0ci9`3jslW!P(tm6g^u_RGN-?;WtLT(ybVyu7$ zy99<^7$~+i?AJPjO zcUMQ@ivRho%(kG;fG9>vAW_tM{4n|LsHW{S)IFff%#wpxNKI4N^6YC5>q?*6w@Nz) zzz`*rh!hOy**+i;eYu)5kF{N%S0e&9gjAc1?+|es2o8kQJWKe{!%I zwg@1sw)8GVC%i|5y+%bpI$llvqCXQ?Q;RlvlD@u zFfPtam7u-PB$FfXBU6lq0)ezVU8-kio++`kdhvJNUNaYR15tB*rWnNFp(7@S->4vU zeDl*sRI1w6PYATBDP^`5b?7vNjU>YVh0y*GX&k55-b(9Sp|#ij3x%jj=t==8uSSDM zk+I=@tl_|wt>09~;)f+-4rOrg2UN<}Z3#b;!>qIJSHDlNx|4e=nam;J)|31&M@&Lz z5!%Zj79b=a%YjPzzsL9cNHmPdl{FMDx=p4q`lMPEx=lIi;nc zbgiV^n8}JARRSX{?*~+?w2^7foh|zCt(~ns_gofcz&MD8BKhS@$ugVHnxOV`_)lX* zF66@L;i3E}q6Pv-AUW1|Ary0^?ev4+)w@!4L8d>sw2(Pfhe{zE&0_(z0TZ778VJoY z%EY1IMTcjbEuts$f`TVY7gk97 zZQ-wt1bsEew4EQ}i0h19`j`|na`+PYNLV%08lYe_qBg}A=Mi96|GQ1=^7XReEY((JW z6&H^zX30!@5ho)t%7-=#0(s(Wk(n60ZW;`!=is9nBoODpplYJ(>ZM0*K;Zi;sTP^y zkhvFvDI;;fx0k-23jb^!Avk~=^CO$E5PuP`{0979rJo_5OG&kQ%O{`A=5PCyiNI>Q zlQLws#=zJ>XXv}b%uQuVidhE4l!p|M$=CEA^W89Zs;r5veukgkzPJ_kJgjv7Ml@gn zL`hVtJ9^b@0gn+2a^>d~VyW%L&$5K$`VwSfP2`eV#DwFP{evh3`xSc*rSb-p$V-$Ol7xaHIQLRx@o{f9Af4cJCMSl4u1q(azU$ z1WMzf>V)$vOZO9%VZDx_k>0AwN;2OXB(f;^MnE9LqZ18DRgM?IcLK|NBut-h&`bCz zy4n!3Bl4Lu%YWLCrJdEkLud|+R!}oU<~%j&i~M4WFQZ(RKb&c$J@JiH*h;RJBx#6@ zG$3vI?CdOS1_IGjn`uH|l8#CoI?5M=*vAvF?lYi zqz@T4cotjEw}_UEPllSGOn}4_HRMyj4VeHsgO$sHiT#l4GV=sl_>aTy9QXBxw*h7< zB0h4tpF2Jd4_Fdnn@;O`WH|+x3~HD zTX}B$bNHOIcw9qky{c2F(fqECnc10-_$T%_0dr_D@ zvZ5Hu|85Npi^34TDVZchHRo4i3?&!NH2m>RjY#kzMOF$S_-DHI2^HUx|J-^ct{#ia ztxdgceFx#b1kjuUhhLRS1wxb81Z*9W$ShI&o$1ze^iY7*?-+Jo1BE~r@(ejzKqI*H zg-55PY<8EeSbgd=1cW12)*8iC-R!(CUvTjN8ADGmKQVDUwSt_NBmoHS$#TeHeNR0t zznoeD$sH)w+S=GGH+UErIROX_6s*$Q+ua?ek-d4jv$KI`})=;cuU&S@bwIzupVWb=?_!D7Y|x)a6WJQDMw zZ_6HnI~ErFTgD#}qrSyWPh&t+1q5UF_KyuLb2Bq@fB#1Iue7%da#vXc+PS&$KQ;29 zyr)ujZ~_J3(gVsC2m1#E(uQp&k6SUXRo%u_OQzaRx_kztBSa>EB6Mx7xLs%ehKmq6 zfF+k&VDms}j{zSjon#AJU;T??SDG+<-fKllSw>i!xuVUkEJ!|10{l4B5Se4U7cpVC z(uEl&e#9VZmLEN6T08v=+=uoNB`n`6Gzvl3{eA6<0j!fWeOqpsX*1m245ri*2$-^1 z9c_ThZin<56J)~M_mk5^bo{0a@f&`%h;G!jz&_UBcsvQ99H?WYEd%&4DBxGwN@V~d z1_V5+xB)HccUYXH351R9Fah_dm7beoOkQPf(ge6l0hiA-fD1t;tqZ>FHn~9mf1z)_ z_+X(sXw^)Db!Wll1AQ0ASPBguJ%7mPX%Yu(<*Cd$+m$yoOasL`(4LNd>r%jDF}sJC ztcBi=z^q*}7Z$gjg^#+rsR&^zEeYttw|l^B&_`wpnx?-&_Xwu)Lf-%vuUO&364islBO|#Q_{bI_7XI+24`~x*^8&Kt~s;uNP{QNf7 zqxo+$#o@<(X#9dtyHgI-L<|+YY^=$y02PCv)$t3g=uws@96i03TFN;Pl7#07R3~<& zNX%_e&}%WO>ln~~UBg1-T*|#|Hwtso<>LliD0rvvjVZCEazj_hzbt>cz>wAX7dqXD zm7Y!J#BL{fdnueJI|=1IKz!p7iB55-eq__dAyWbTD<+=Fe7#%WsAz^H!N5Bk9wHOC zk+^POZIdIXKy*ATwo4hJKJfm!a;kF_gW=x|5gE(w2fXJ;zJwrZ{U^Av)9S7w4kj&K zBQJmNw&_-4%gQ-g(UuV1boG)(pBYO$X=wd4rU|8Eb3JEn=O z$o1OI%f}xdaeDZhfAOYGoc)^eZd2s#aJc9k&IbP%uW!agDuBo$meB2+nHz#cXGw?-Bu_VS$3gMBAF^jq>YH z9N&D-WDeG&tv+5QkP#}OfGQR4=K^k~bL!SwhI+RW#E3|^jX%NGdM-M}{H{8TyM3X1 z`HAF-XSYdkD0;vuu`FE*19{bHg!y`BeJxy zaOcya9%@Mzqy5HhoWmc0-8_CfCCcq(xV(Hplxv(H0DBUBe0+Lu+jbs0P2=rEFS}R0 zQeX906>v^&pQ$U#Z~j7v3DHIU-7-IwH=)4Je4YXT?291O=N^iCn6lQ)Z7zYlN6X!< zqJdi_nTOMiI3f=ad7rJB-GbUUEM-*upL;uOnW$-=lr~45hF^e}x~%Q(bHwIZt56$@ z%H$reT1>P+AU!2_Pxq!4kMNQh1bZX`d9)iikk*d!Lc$rYMay=DULi0fc%UvW3jLEW zDrv5HONbg`=gqVb2vxC3pN4P%Zdk9kY~k)wFDD7$D3g5y%}RZO{&QM;!s1C9R2+jF+N zk?UR$kDh)skm*_(SzTxQNp@6F1IN8;l32IzXis$ERz_0i&Y<&(%kW_sQaq0jY|*RW zarfYW{}>(f4X19^pmOKkptBK|Uwq;_(Bw+PQO?}*diU9`Sf*0YSq{Bd^XN5v=dpLq z!?>{w;YXcQ=ff+++r~QmtF5rI-?e}O?(sLbGyitQ!xyyBd%bhuykWik_**Bg!2e$s znCx2Cg3EV*8Mfka9qM`ur6;&Jx;Zyj4LX6|i7Pel5E}b$zueXLf4ZJbG46dVh#Snm z!D~Rlrfn{#c|U{^)Q+WKSZH%{4?cl8())v-1<3073yyw{*ue3*K{=@If)^|v(qel1l&ah7IzU~`%oMtNV;FKWr%Pu9!oJ~q&c$B z_8T!f?Vd*|3j5(|F6jhy*Q-8odzOs3F)`D=HK^-?C~pZNnCa&%Zvh`e{@NpyzvQUm zyTNXw`xAS<@VqkPP%8h9)!Z!_Q zY#+uVYsCB>Zb!?nW^Gi+w>Q0>9tM)=#|^!wGE274t~w&AL@pmJQ!zoHoiWzQ2q$>| z5Ul2U#n%Yk<}4^5zUkS!Im~bLQEQc3`bWg>*u(1B+)>!;f?qi14AF zK@WkFQr8EKlcb@xktfo9FZLLpf0TM6+`YtO`< znrUJm+3ykz(Eh`e+xiF>!wKYpTZ;K_d9{B0CO>ukc)Ask^teeMl>czpol)-V2b9KM z<8RlA^*q*z9S3O}E%lYoo?$d#v$CZc|NF{AqWBxsv2y9bMWL>40riT=4K>RcU)zHr zGRQkJQW&`Xvg}J7$von_s@VQ3EaFsHS%w&lXD5VfMo0+05+1Pf%-v$&eaj321@@pR ziGYH?{V;UyOHWVje6E6Vze4!kGO5Va^dU$9=N(qb-aN627xd*?KJN)ewQT9H_jfL- zegE<~n-48Ue;D-o_Zw<>-QyJ8UNV0wU*)L6EwnyuIo0=` zB8a*Q-yO?uzK*J&3#;E{%OsYz+~f*fIT{&_xH_tQndWBcBAK92-P`8Xo}l;5+Z)(b zYA@|`hhh^W{FzxlO+jxLH>e`YQ30TUF;nZe3xmOkTW^kS+a;&oW=|P#gzX}QFS=uOV52$c@2%Tm!^QnlzHnQbDMvvkoOUFjJb zLlXnCgHC*B`C4lYdYdGhei<(60A`=Q}kF^RAO9uz(F9`3Jvq zfza~u>j+*IS-+Iv;*Ng*a+gH992uN?klyRRB-(4LU@hjps}r@KM489?G$i&Asnxkt z&fcYn!1A_iVyv<2>AL&?F(4`*^0}9L!P*Sc4eM>L1uW*n$7MBjU9DvoU894GAP^m! zews5uLBPW{+v&QWCfDDSiJY-qP7DJaiHd0|J-=nT8#R4JN zZc6;1GU@&D)H-|4U8!tPV373echnUeQqAw{g9j4<2X(4&L%ibL|M3EtUJf))FnT_% zCG`aK8wPbj%Y=IZFK^qi8{fqE@z*UAF!&#yQeCnU;aGioD1rst7mwDlxRIC@r9X9_ zwfbt@{V{wl2EJ^E1iDVl_1sS~uibc#>hy{XS#r|8eY{S8^a^OawN6^gw-#Ldd{wOu zS>9@Y61fr{(wS(sBFN|O-uDhFAZ2(yT$Z9Z=c}*ipn!Y{I2(2%=Mmx!?SvO?k=c;2$a8Rw|X7kR2bjh znaLK=D1tHTI$bReaVErCH^t+|xAM8}yR4mi15~m~yu`9Rw)5D%6^w6&Qig)AU1)0s zmfK%f?TVa2$gGpt1n$=2BD+X%;Cp1f0gpjqJ-gkmanAX|mu>wFAjV90=vuznzX4jP4K0d%fh}%u*=RlBBmTI!1Drvet z#+DOv(XL<5{KtTT57PIQ4fE86rB=hNWuBGpaiyH?lbbfm}1x0YQO94gUROw(o<6 ze0pnnK2LHGI!8Qxw1uw$?}M6!8@bo=l=&te9Zsse@CaVq*qH9Evtvq08D@`ecbtz4 z_xJaA8~%RL2fR=4k?o5g*I*`0OL zlYKnBSW-{kC<-Y)1l~(yVrfk1JnreNBlqRIZhQ0Q&HgO04Aj4D`W}arlZm1BlJctd z!yf1H(@xil{XoZM`-?9PBRpsS)Hh`kM)tmZ)%m^|8XY|zgjM4Ho;#xSJ$w;$wf3LR zw}g8F4(vQOK{g< z!QF!gcL*Nb-L(lW0TML9C1~UB1h?RgySq0u&gOHzD@;%`~}{ zscBi%awNI7mMcR2!SQZUPI^bV_5(|b!h7|jP7+|SrQWRu z3=&10if8COYh;S(69!@YA%;%QgwvnA+A^II2A3^yaMk@`BAy?L8@H>%5;T>Wi=XJc zt0`ZbrIr&`^(E+fo)4mBs1SF8deIkaSvmV}%pE`6p7OhZJ5tuzkb_5cf*yYd&5J>! zn=lSh9bbZm89cq@VKNFcObVH>WNx#gQoUAld5)v>oS+fvR>&Myaz zNI8b0uF~J->Ft!CWt9W3Gw}KNX_;_6#bH{hr!tQu>&YNGf}noBcu5Fc`RI|GzmmY^U#sJ#unTP7p|cc zpYZ53&JX-`tNKiAaD3eeY!d=``;DxX#S0pJy82^~h~o9Prljt({Rlp@rH9Y=CX9Q8 z6v{Oo=h<6VY%jaxf}L{z^Kdy<)8`Ncg8)(wd$YaDMX^p`xdtBK=}?tFQibw$?F9I| zUd~DUV}I8hjz-A2#xgl5D_2Xo%g^leE0VYalel?7yWJWz<)P0skhWco*pnW9Qletp zBeC9l6D8+EQwO9cv?!JI!7y<9_gB|AdAwlBcRrWkVM!fr_5O28W+`cKDNH9EQ02EP zDTwo)_KweuScT!TQc$`wn=B{$KuHL*W0YyD@vFxKqR=~pqyZHo9tSX(80dH2)wMus zko>z9Xb4;!0-X(4i3-Zd8(&=}6}(q5X{|#1)9P$Y#N#?w){74S40@}si0^HIywkvA zuP5ueMk1~kQJ3E0FIGC?_CVnjG&-pa}PlrnJ~E&ZCX{TJ|ik>v(UoSJs&4dSbnD;WY6J+n66T zT#g}*lsn)r_%Yl6+(z%&7HKHa|NJ56yzRL)Pl|g`>DSAO|GG|n`P{6U*!gu+Rol@O zb+4>S`_;hw{)du!zFDg(zZ3R(rIxE-)2%(;+0EkI?tklYs+_mO6$Jg~I zn}d>J-Ia?i|Mi{Z98^)uNF62Obl+pe*v!-=6f0#S9uJ6loo<#ds$BP+B0~c3A{4)& zaIwzB*K8!rRZ3Q+`Mye(eLc(n%DSx6VZA)>7qko7RZB~H*5x^ni@Tk=`yS*v(5v9oD8lNW)i)?JSM5pwf^ zZ@zmOr(?jdy7_14=}E=T^+fNZM8AJM0iX9rpw^<9QW#C6`4Wr!PgHpSWB8Gv^jT3!#ai$rf> zv@@?We9s5Q^ZC7X5wSBZhK)UXaq@OaoXC`Q&*S4 z^+?WpMkKIR6>$IBGO*}5&|-oEpwd=YRx}RFz<5(zk=I$c|H?5i)tQD zcDhX9Y1^mCxCxh)f$F^3o{mo(nGldyecT7KZ$RSy+ofi8PgPwiGf{xw5v@x?O%=Wl ziS(*QjtwJocqt;|u%9b8!k{!t&k-~0YlyZz4$`}VghH2%100sq&KIQ~mD+9xwxpH` zU+&aZ*&#L3DX?SRRK!h67GtJAfYP?U8s2Z!5E$Mufq3D&mw318?YpaJ!dwh82K zD3ndehLqb1(i|&wg?;|Ad1?(MWA(d^7QeSe{8(011uA2FgpBQbHDW# z6`h;-Uzn^DZ*j{S^01ERCi$Oia>pvqZlf1>pH8`i z8%c)fqz_vTYik;41_VIgB?NAvD|K4z#oZpYH;n3vxj^R_j03F)E)W5UgGL5M70e=6 zJK|zeN)t7`G$|CsA7AELfUU3nLOFMry@RT8SL_qQjZXJziaH;FdkypKhlB`#MDyJ= zXR)jESL8yhbfHrrVCdtX8v@G#VByt#GjV2%>FDC#g$Zy~Pj65!krRU0_^>M@}i z|J^u=Eo-yjHklwrODpFke3RdOj_~EU2Ia(+o3h2S{pY$ur?YRMsJk{*QYW5QCV@fLKr#Rus&oJs0$(TbnI&W!^`TedoL~Wa3m)$ z`qsk^39w(z61H4Yt25jLu5bHo{dHsiPP9C! zIgb){`9cd_3Xp3(T)V0>D1JR()P;MCLyuVBJ(fv#a~>zky+Vp_6oJgmt{Ne#8JH^e zsm=kfNsGPj5TyV3uFk$TpGM>m{vB=E%&*_zmRo3)S!+C>%&Zb4$JwR@%o}l<4U|6` z2cFbK^NU?wiOwk5h3{miKzafv#vUyPYcd$1ShfN2y@quG2K^b7?HOcdIDp~6=LIm~ z%hSVr4tv*06=5;j_q~ar`+bD7w6!3hSr<_u;}FIEf%Cf0MT2viQisjl#oa(Ccqgp%|1xF9^b}@_UMN&X-$%S~72vc{oP;m}(d~Khbubmu3$TfN~_>M`^I_KbwN-S;MK-Zehl~OU!MM z{t(U%fHMDg{WF#LOP^NK5d^1{8|mf@A908+vY|G=y}CrLkXH~Zl@}lj2(g>X0-Chm z7Bz|8A9mwrJM$5&Jx#FF z0ZW;9Tqj!@kqn4DR@x2J0V@aH*Xs*9YLjF#rB_t@-ZLy(h8h{`Vk1NS52p!W(6C-CC*$dhCw9tFPF=j==TH z*303}xJSlq6eID{9DT%GtyqCptIb=p!Gej^B$6`*9&MaduAMo(q_cbIfRWxVZeXuh zMRr=`25{Zg-25$4?)0Nc;3K&Su&yzMW{GN%x$D)nhT0Uee%3s#T4f`Y(vxe?Z463A z?>5XZ`YgyO_K_M8lB<#3n_!Y*0ZpY`3)oua#qPXTwwkUQLrXeg=?a3G$L+$msrxTM z&qVZtr*EIr_1#1D4fao&Ti?Pdgi99B+JGx=;a@gkigSXNX6*iay#BJg94?&G5>#@) z354FL<`KV>D~!x(0SzuzTh8{dcV*;gYnV6auZE1ws3F~hoB2JzToqui`CM=3h&7L_ zLAOxYNeR}+Kk+xn5|en8U8~#kz(px4*w1}0ySdgKN_98B6XxTB>~zUwjmzQ1QOkEe zB>75SprQWQ(U7;RYGHx-NE}iDk_faswIJJ{-Fk0(5NN_RQPfG}@;PaEdZ1dFv&2sx z-$loa^Yx2Qao6*u3@2q77|@UHSww43n8i|OzId`e+bpG4shm-@kt6M@2v)5i@dWJ< zL73#HPQ$DwYC_ur6a5$>?izhQg9{<2>RlE_rg}!QpFfdKILg?#mC4UMRp|85L0uNH z=h9jKL~H&of^zUFdOTuNc#d8oOiSq(ec+^SDb9HuJlR5r+zK`qOs=z2v-0KMQ!s1# ze8wraHp-|d+WFjlc_+^=O)}1>7T*aOPzSx-j;x=p2sj-TY7SzOFD$D*K8kArjrx=7(dZ|WE z-hrXB6*EL0#-AC|O_RsJQk(9Sb4I&&-am}9p!nRf={HuLMWj`}na;X|s=Bc~J~aRX zn#(5^n7oaI-&6lJv7TfLg#KzuYg}NdInQ+o@X7t$Sq5ZZZJB7Dd}y?(Ix4xPYS3WF zHfIf4*xJco7_bSw#daH@MUK;-HA@^hY(ov9LN6Bg;Q|SrU?%RMMSVKUz*`8240=Y9 zfyfKo^GK*Q_@Ay4#A<>xn8uqKNwRQj>4x{`SOWRxWec4y-)TG6eX`5C{YD_(U|gV~ zNFg7w!?R3|UO4f~CDbTP&`bU=xn8Jsy*Abo(sGT*fyt-3*AdPV-o9_TMT1kzYTNBJ zIA36g`s^>?zvF(JOhYOYJsu-T%`E);-L^=+2GcCFrLs||PK5@e(Bl@zw`oE3@z%pu zLH-UNpnZJ(0fV5^!ESHj_!GiGIm^>|2>s@-`Ht&}wr|Y10Fn5V;zFFJnUidesJ%5ji1)sj^TK_vL%b=t3_%DIi5cZVaU0cjn zs#kY=BbQ||))`Ro-H>{U%J%v4p6lC?Ui|nQq?C9%^H_XR=9t*A@jpW!#Tn}*-e(o= z_-JyynO zXW+$_Uen2H^GQFUG4Kp&cE9eGIPaBQa|y{(a^mZD3hPq4kxmp&J@WdWKY$Jm#4lAV zz`=6j6#4m=y9aZ$ydu7M8EKEkWQ9Wg3Xj&6Ru$|5L&UIgW$A%r`Hp}+;N3J7RLfu_ z%F-hjxF_b+HfvUjfr`adqVg21SLUvB?oeX^J+pkhx6oT72ezDVMxI|+E!NP zZof)n9diOOof|)$!o}L{EJQQomQC*DO$7<-z9bth(%dgqSXr}NCoj>wA?7kRsy%J|rIA#PJB^p7~HXm{z{#?uM=B=9mdxt=ZGuS2i6M>dyb?@I35>POe zH0Ipg*u;tL?0SnC%uT<(Tx$^V=&s+7*Y?L&9ugyNM9yb_-afe5%uwZueyc90&WLx0 zl^*V^vcRRV|H-uVUK6{#kKLe= z2*t=EW@**Kub8SG588d-ZRZn|aR7`@&dq^)5rbkr2UGj6ZljP-Kv6pHsT$GIMvCUg zAHabuPdMTvYh{z$(WX~Fg~~4Lqe-m_$?Cb30O;nUupL6SpIyYd;CNb1GNtcc%e+(D zODzXwMMvk!W5U|9etFPco_#3Tkz!EXu_v%jw(D+{Gy!y6nZW}t(Qc{m90fj|Jf8A4 ziQM~0<|2RWa-ES2=-Lvm61V?;HgV(Sm&vJORcx`*0|7ifV`<<^>K(B=-<3`Cj8is5>x9?!3M$$d5@`zf`dm~ND!9O z^=L9(Zi<|w>R@px%~4sMJBwbg>d%^m$FK+(_&C@dv8?&z|iU-JM0De{%2@;+Qym zu6Tjjo7Xce*DHVxuCAMj;<}w?L10U5&7nt+XH$Yv<4qR-I@!+$H@kzDhWZATL;vkS z?48+m$Z3XZ5EDzBSZAP|YTIMcq(RQJGYZ)gnWa+eW@qR<<;3I5UZIKY%|J<5C$RJU zcH+eqdM;kOgy#b7Xkveb^dl%$ z&8$U|l<-=@Qibi{d|5aX-MWF216+lk&hH1kJb0fk0m3yZVik_=At0zpBCdZWFLv|E zYXk@?dc9#{$I8dw_q}B2F*_j0%F51v0vB9&1~lgB5VU^LZ3+@5#nDno0cvfDs&;v- z{{A*FPG|mkL=#3OI-$Fk_1x3zJgm^sjq{6Z=TeTs2O8fnb|&}x=S|umHlZlz`LlJG zzp5?ALlJhi+n{Hf=w*Vc>KSfo;{6q9qU-kIgg@sAG|S3@$K28F{a~c33J*ZM$#(1A zL0bPCc%6QK4$TsAzpcamlz1=x>UXuymnNB~Wq-rTgh2WFXtdd?a^T7}Pv+`05oG;T zhON3hY5jLqJm}FO*xRb_E$%Zx&pTBS-z#xgCSL7_;lx!deiFJ47t0cR2MrDSvv(g=i*CD!SdCPE@EI@^ieORQmz6@pdv= z|Mm@s5|e88d_BX+{8Zec*%{^pSu}1j>s|Xw-W$#8ceo8!L{Yz@2Eg06P2r5#>jk?Z;asf!X-9I%lc8Uhhv`9?CPLHFL>l3%)#M z-m(EvXx~R`q37&eP*Q=vbhBrR-nnzkNHTr53elQbxM3t^3RvW$r40f+$T@d+J3~0@ z@6uMcSK7R-E5>*{eEe8KSygD;6fxXtuVWl3y4eM|cm>BxY+WUeVz3-1%1*dld|XI1 zr%ng?m44o*Wpn2M&pV_0^&;!gS+tP5l9TIkx-_R2EMY-JrjdMn^t4P@f6?tmudprm z`4?8ig1SXD5})IW*_n20!Q?^#CFOHg=&0u@*$!&W-p*?qSW0Bce#|^=CpVGU6pWyn zUm>)Q5Tz?H!TCZ`#`h_4p$%{oRYD#0@#Iwgh`wH7T#WLkZ)n1cFUPJtC(CV3Jtyd@ zpU#L0seLl<1?AjhnO8$_h)A;1@j#kc*Mob|bzqmpaH6XCbA48zVQS1QOQSSoL`fB5 z-=3MV&(31+c!S#Y{kN&q%(9cs`v)ndbe_X#hU}rge<5DfUE{lMtL_t`xVY`%o-8Eg ze0mYXE^Mp>r)~mdY-x&xI>}zX#yTb_8Q};j6 zEV>voef{(%?-ACA|B3|wQNgBjiw;BT{ufZ){}Yt=zvn!zg*<^w-u1*NhXM=;^vFxH zTs-qAO&J*%Zy;2WFaBY%Xy@(Ih7JP(uX9Fsue{KV;y;X1$k%>$PzW#4;{0a(U4$Z` zWo_$}877i(AX^%!axK4<7xogWl#Y0#SE%(sa$|h(+nVSUT}#38vrBLj?B;2NUSW^A zL&cu!pu_0XJWWi9M&8BTBJn@D9>C{oFoV|)z7;jPz`y(VhZA!2H7<1aMLWIGf#WjLt z1fbPrZ4Y&l289A0&ntOh+HcJG=#&MW?^M9#Eo6M*L)~v-PdckFcZM_7g9$cFbku?5 zwpW|`HOBQ7Mp>EN4u;$B)M1Nn@i7NKh^l7nCa#z$&>lysHwCbC{v6&*fsU;_6d+jr zB|Z>T>0&7L3}yU3I8*4eW0vn(PhlIB9OA=v@QEH(Qc0`tn{8U3wA{n--LnIphyXC!)#FU(SXK8tv z6Hv7&j8JDg2lPvNS<`&*IhMmeqv<#|e&CH`+Nqx@$vI zHpi5kapbr&X^DLth?!Z}Dno_v{t43axA|gAqDNj+boP7xu0KxB&JVW_+tsZ?6`3%5 z>dyeYGob`|%zxaGhJ-2SAHnymT3R~G^uCJYl)gFgX1a1z&77 zEO?;4>vwSMv2qSZm~s5;|&I$NDSj5|+(s{C=}_I1&Aa zlBqY*36k=$8C-2Yg%2wHtvKJP)zzIB5;gLRA^Xn@pxd>xl}4Q+U5(vm)u)DS4!|Jo zG^bYw(*HcoPpf#gVlFrPql3#|Mv79%_9?g4Jd&Ap^=b`G!I|(QO!U(GvN$QC4{y%k zk|`MBzM#gCi;K-I%RI}%VhH}*qz_wHAx@DEWpgXd1Yh;d-(2u}{i%qj_g zRHEKwZx0G9u1^nUw-BnFL-EnIY2aV;)Q;Oc7!GI&gM} zrdjVBJ9?@%qxhc8@>73oEwI1nN89{-^P~VC{gfsQLGR9>I~$?OZ{bwblA&$7xy=pH zY<8Gj?>I!sr-Y*5Mc&rNTnt$4EDLp*wSM=QjD>>KqU6n+_`tji z)Tn+1rMguRoSd==!hQd?KW8I@ggJlz;B(@@MKuQq+!Ab;iWZ+2@oz4Ux_F}-V&Tp8 zveGU@4U4+8qra{lhu0qVOv&_?)HMoJO~Ze*=4v51T6J=tyR7}KHnWKB>Z!FmZc^LW zKF9nxSX5ZVBUUnr5}zf)+t4n1{EmoZ=W!6M0u!lf@Qt@D&&!gGrC3ByLjW-~j!LHx#)Np-;+FKoXs zGY53Lg%1kAYBmyCm@UDof=%_l@OEgu3pD;dWsd@Mp0NQEToyR;;sO7xxFR0yvWt7U zlzqiwON)vM${7N8a}VBn&F)OxZ$3*K>^<@>4aS0FKiFZau1 z7$!NGc_Ye&=%}WzfNgy?C1em7=qcl>-QgT|e%Pi@st}8T9>eU&mL^$<7N?-3j4Ie{ z>1gU(*mk+5n_6~bAEeI0a~O&&OY|GY&oj#>kPE&!6sH2q&G_IYjH(-GXS>4|)*2fl z_=Vaux@M{qxndF`Q@b%V-iyQwkW73mj69CHs&zwW$>SPecrO!q&(inqvE^j0cDg6z zX&Sj$v2ZR@T9&>~#ulHP<2oklpuLEU+cnvE^XYycX)N*J7h>Gn&!35N+-yo9jgN_C z3JK0@ja>tqPAe<+J;_0ETSfOQr=0RqGw(c@!)L74Is)Z%Y#px++(DiLzw5IPYc@$z z7!@@fEjL@og#UU0)JnkW^0o*wW}XV+JFa^aV%3kII>%P=oeLSGh*l8h8Mc-y7CwLF zW=|hR$*EV$zqx6C6%Gg@%htg{Q4eFxJ;XL=0W(A13_?7@j;R0*n0G<^jXHm5xAR|q z;zxQ4U*v2T-_F}!3`rxlT|hLF5%S@m^IaX;5zDCM7qViju=8S+*MLL~D$aG)h7afI)1Fz{9etfd~$Zw@x?=LR34IZteT;*SI zYFcz)Yf!N!Oa3uM`;avO)O&AF%;r4}W^x6E|^U7vO|j zcZoP{I2OdUb$K`N%+usgLd3 zvVBu!G%{IhmVXO?ZzR<2kPu^dXB(X4tsytiDeuL`8knK! zURQgnA`wyato$Y^1k&v=BHcnDNT0Wy>pX#x6pp1k81Yy$e}tH&7|cD zA5o*f)!EyjD}v~W)sFLfrL^~DjRs6yZ$$gg=!#lwsrt+r!d zlM1MK10$rLE^dI0lq_GTIqXJu)8amjk^OMpXftu(N{$Ftv@%@dUuw2rt&Ws&$2@pVX z6#_(I4rcypelaMo68RygEOuvM6-#H=u#sKGQ4BaWT(6p=TBU3%HtnwX+)ntq6gGzM z!s{PGaOZ<5wh}L8HH5w*0DrFhM>MqBObm7U(abMs|*(v+`&im3t(P^%l& zp`WQ%I#sut*8KtL|xmdWUgj%tkuROsV;X=s@sJ6P8^&6g2})mTu^(~3EJ@YIuw zD8^L1!Y~L;GSyn?wCZjwpnnTUv+Uhtm3pL)kPClE|H4hnW%=cGA$WycvCF7=3JXT- zC%0Bp0KjAJVk(%);*}H2Y04jm(H%a-cawu7LGw9qojb6`WISRtXtdkh2Piq`*qJ zNB{|?Gk%-vqJr7rg8bUKO+9_gGajt+kX-5cyIj}Qv1-3KenX0QM-Ms%2~X#5`W^c znZbIuPSMUy-cBxbmYutt+@ei=VFW-(iy4Sk)9y_XT30c+9~ljEFcbU z{9C^OPgtoDn>+N$pBEcZGZU5s)YVgaA@lt`B@XP2jQ0D>84aD4?MrWQOyBmsQ;tt` zXb`r1c5V|)qGIfON2^ADW+lo&;XPv=FX25Gx9s;i6kDV+Cgw*c+|^v3KeGFyVm90W zYNbq`I}p?6JH6i-o)!3|-4(9sj=Z+U zWbR(bk`CmtgtHCeS(1Ka!wN1=HH+fQ$lP7SpHxZdA!L4S_5y^ch;@hGw={ENB}vtc z#^e4NV(E)V27Cv7L9vTED*+oagM=@T}ml0|{iCY$F0v#HjfseVO})wds+x zZ?G2ia2n+M zIzqSv`cM`NgN6AYKfl(0qKt$8t`JXAjtnRXm3(fn_I&lzOC(b%9v1(-{{8#f^C|tJ ze~@7(`9}%cQo7=pr!_fgFqZY^L&v=?W_;V-*5B#Z%JTYVgJtY?5=#!WqZ5mPFxwD$MV^h4NnrCd)$M>E_{Zv5y6 z0s}*p_68i)lfGXFZ^w+u%vu13}8`bmD4vK;7}@<2Z~Y9_+n$~+ zlqf~$^npug{ZTuRD1?@NtF)G#gO!}W5-+mDw(P8IiGZlGwZIwAkvco#l+0927DB~= zyStw_4UG7NSwsrw=k{iA>1iIc4N}>Z5?ZNw9TyzuNeC(z+}i8&*Y@!6?M#5{L(LRl zd!}ZWNepY{@_1wsWyx3t&b|_nq=^N6d=SjqT{!C~d`^0_j2~mIT6ZlUI!r~BIHcTh zt^!prCOA)&H8U3Or_gfmIj`wjdn4ozi|3lGLqwMwf3kKlfS-TRIjqEzA_j2oYEgI! zUF?~Ov}_wDmY_kgq~*PaN9C22Q+1Q?2T}4rTbJ14cHhKeF%f$EY zQe10ty26O1nD)$=&|;?z7NVz~NNb20r6}%HRqcFQ;Qh^tp028j;)%b#p`EX-Ox7$L zGp|IqM3C&*T+02&{>o4}y-mk0Kh5>p4uWDYPp~qVAwc@~xBd3L>V}agLIU*CC{&Bs^o2fOhye~GJ-0&N zNQ1+v8JlRiaPr^5aCsx_Ac0`B7JTj@E@6Ov7&mfQzpP9OcoC3SREeeDsZe1%)GW_A?5npZ zSeW8Tp*Q*XFgWo3p11S81g{H(PHOU{e7oN(?KdCd-H{f~#y;f+frlC?Z=7;=2oYJD zR}1iylZvsisf1CerdDaFRKZr#)^<;*3SZ38o6c?tEP$BMO?0Gmcn&aF(?hawzD!!Z zaEyp++NHdt48~Z76qjHUpyUt`(B7qv3G<&~>|K>lh-D9wL)j{|ecwd7pp3UvH6O}zB@zSZU=cY?0 zUhi`}-uf`09#>fwW`y>)qc0kU+_uHH6W# zw=lqb+)^z0bAn`8X`_W2AQ=ffLb!^3Eom@tRAX%|OtiGBqi3B+35 zOagCG_)U&c95Y6l<9D_``?>dpQ6EL&A!^l!cL88xQ>|3XrokCBhNE~xCusORr?T|E zXo|w&`98v(Puur1X?mK!VH`=YB1ly&q7-S%r?BWZMi|kfnRUYE$v2Lp%TENLj(^Vh z#S<)fGwV11vX^QW$-mJ%PT7HDOh~n-HwC`_1DK-Pi@5b=Wz;821O*yA?Fuz;?oxuI zqDqoVQWORf8yWG8hv>2(Rvs^Rp=XkK%O+=`us%YGjOehTE=R~&?yUab0_n2qy0I;|382l zjIaG>n_1Xx>1<$S6MI6PT_&zGm0*NVwd+rv zb>_OkDAP;z8csjirYtUd!ls_JFG4ZV=(zkZ^9v)7pjC~?(Z#O~zDljc+d4%YI@RL` z>Rm4UcVQFkLKsPRqtj~H{Beg7M#E&dewn2+;RbmKW9c`_v1LOIJ?PL_(l!l3XaHvZ zLU<<~tedAv?T2ND#@5zWPZ)u@UfqBV4>KORGocKtM;?dYrbdZj{<-RL{D(ykMouo+ z=TqquLhr%Q=Y$wNn6H!V4UC3qZZ0(?1qLN04Z||j+Kq6t;!W%AaquP|7U`fbG|MkN z+rWcTNir4IbuSv4)-O@{C9`(0q_zDiZ)GKVqv(>byT~qD{Vd7BrYxB3T9I$(|9kqJ z$K#8B11@cE?pwge)S6*D1|^*Bn|fy@VIPuBkfI+z;kEeZaUs>pL! zM$N;j$DFykR2av79Q4RsOyd{UqdE|;;S+Q%0Rt$9v(sa0L#Ex@dJCXvQL(X{b}A;` zlcwDJ`-I@1j`<4YZz;&hkJtfwiBGiQyO)R0@LFf>ndN1Ekw6=z0E_REcvQY4u+k%= zW%wlKhK8^|g}^1aioL6oOqvYED>QV~C^TIb0Z>{L>Os7zR%zdkaTGyyDI$zU>&CH$ zmm6Qcd*O48#N`Ee`&i0F;gp<}4z&sTb@tohvgxz(%>fTlMi>BFf#v%Ij{^9ny( z2QgzOokL97hR@bc3+??t$nV%hDdo6j%Y^HTGu8}mO4m;cCME^T)762?jivKzB<8^_ zzs1$fk>bFEyZdJKOnjUMIV zx@g!IP={Nrd)W=J&kYPy>`~=mAymftg=!{0nrse_9G9Vk#zK;`fZF|w+u4kSS*#o% zz4JR9fS3DWqRgmH<)YtBvQkCjX#ospJ+`Vl#6*6BDX#7z%rc+70%k{sb6mHRsFFz( z9|3*A<>1(Hu;(blDYy6XLX(TBDMUQ069wS6yHjp&Pu@KN=-H zp#aRaPOqX|(@Y~LkSFJBGr>yuNKb80I@!$~Q)CEnu=UZQhU8BEzB#i6w;r#icN2?x zGQ-Bm**M7l(e35#TA_`+;lQ{aSk2h7UM+@}C%H`=*c%B|Y)GYGw|DV7Cc(k=BwsDJ z1kYo47i0HH`m)~Y{9&bHdLutTkO9{JeV1EXc2f`@N%g6($1IFxk{>m1kFi0qy4>bIEe#Smnb5@#%Be^o)}XI65qDAoYUYV2j^~ z`Q>`KZ!Y?^MRAM1_NV;ycLM;>=H#U%w9xdz)W7-~{J@J4c!vo0gBmsUyKV$6<^gFe zmYwS=~*#hFP)TMLB~B*vXtX!c{Iw}Ym^a_)v0#*q)D@JZrNfu$=}8~XmnjKMSuIs z#RVHz-5aAI5#>?wJINBBtmO%l=nrYQ=G6tGkoui>uMM;2)`Db?--vFwX}ZIDwo6h> ztE9EzAHqx>HHoxsI0^`#=$^a@uPOjI6o5!l3@j=(9Bx0eM^gvRUfL|NX=*0)?Sk({ zVf4N(LpbN=69%H|pc&()%Y*D;#}Q{oicJ)D2ALCjxxzW4~#V$^I1SbSvK z`ddUSKX6L}`1uo6dj?|C6gJzkkc@rU#E$;a!}Pn6Kc8c{%trDkS7@MzLOANiMbVSt zb+n8Co`QO!Wtt+qN{-2THeZH1QiBRTqjoP_daBF7PwK+-v3zOiRmZ;vzYJOHiUQ_r zKM3Lpq4}2q{+#t~+TA@;t9zT-D-cP}ehx&GJNn|;eI)5cjBe!8y6J%sJc^ltF`jx# zf==vWNsiK#85AqF$i{NYf|7TVQ9h zEf|(~|2eTKyc!T`6(NPi4}XaE`zakAlrpHVw~hMd8~QCj&wF*BlUZH{;0)sWhRc)_ zJ0sg^$vcu~NiB-f)<$D**-_ly$F)6&JVFh(GWXW2M5^O1&^Fj6MjD153E#$B9pnE5QbNP%nK) z-a_Q*Y%wLnLKqP_9@qP#Y`;kax=4vMY*H#_s$rKbb6@ye9I7nNH-G6R@KoctuXAr^ ziwvDU2nIj7K(PChvx)Q*aOaI1Hj5=DmnrpDus_3OyzWPVfHxuA_wjEOEPnan7ZR;Vk&MIyrSAR)5$!HIdJ zN>++@+^RC9H`-{>wHonKqPZQVh|cWxE1!3&1$bdRPlN_OYyr}(86X+Iw_}j0;p66} z;FfuRhXo>GaE`XPNFWmTwR1HMI=g(EF-j)6mV&(Cxu?0#oVk_4aI!KL$R2 z`y$O~Nit0%B`qYGh>;pui7pc?t;{2kQ`MfMb zz00tQYF@{WaMfTl9_7ww-i(Oanyky{Z;nGY)~-MKT3mP|-`ARJ>d)6g!Q@UwE6sez z4_7yfGW6*deq4jrT#aJ(@wc1H5G&$*g9=aQT6K`R`NXWK7O6mUM<`rkLTIP{KmNUfeF3-iA#U3=yLaVntyp!^K zIGn}yRWE&p``$vNjo;eAlkbg%DK$#a$Y!+Cdb>l{_d3mA>3a1u+?p+XNp$n?-63Xt zSXM4n?$`HEk7RFu+K)%jWL>RB8qlp?j| zRoeeG`f+W0(nf6M1-ezdzMC8Ts7u+-)8uyej0^{$X!UA)2JV_9!fN&2-`{t>yv)^R zApATJD1J(;O1vL_a-jx2)_wT(Ypm}Ss0$Cs)n&aW>IkBzOwgr71OTutqD3JTu*pOd zApvr~{r4{=?EVtYv4oG0Z0?$H00oHJw@UK%{r3McpMR^%JsP%4WsMy}g$zCeGl{cyHE$FNc1; z``}RgCFb>`uh)9>zFxF(WBWbJ*ZFL>^4)`WYxxIeDh7smCP^Z|!?%eb`jeP~S6_Yg{(U`*H4{TZW?>qU8i_D_m@27fc-Oxz&9U%l Q7XuJ@y85}Sb4q9e0P>=`F8}}l literal 0 HcmV?d00001 From 502ac9eea5d1dc769826a828fba72fd8e2ca6070 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 7 Sep 2020 21:49:04 +0300 Subject: [PATCH 081/116] added example: Defining child features --- docs/en/Features.md | 47 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/docs/en/Features.md b/docs/en/Features.md index e125f16f08..963f15a9b7 100644 --- a/docs/en/Features.md +++ b/docs/en/Features.md @@ -222,7 +222,6 @@ namespace FeaturesDemo } } } - ``` * `FeaturesDemoResource` is the project name in this example code. See the [localization document](Localization.md) for details about the localization system. @@ -257,7 +256,51 @@ See the *Feature Management* section below to learn more about managing the feat A feature may have child features. This is especially useful if you want to create a feature that is selectable only if another feature was enabled. -TODO +**Example: Defining child features** + +```csharp +using FeaturesDemo.Localization; +using Volo.Abp.Features; +using Volo.Abp.Localization; +using Volo.Abp.Validation.StringValues; + +namespace FeaturesDemo +{ + public class MyFeatureDefinitionProvider : FeatureDefinitionProvider + { + public override void Define(IFeatureDefinitionContext context) + { + var myGroup = context.AddGroup("MyApp"); + + var reportingFeature = myGroup.AddFeature( + "MyApp.Reporting", + defaultValue: "false", + displayName: LocalizableString + .Create("Reporting"), + valueType: new ToggleStringValueType() + ); + + reportingFeature.CreateChild( + "MyApp.PdfReporting", + defaultValue: "false", + displayName: LocalizableString + .Create("PdfReporting"), + valueType: new ToggleStringValueType() + ); + + reportingFeature.CreateChild( + "MyApp.ExcelReporting", + defaultValue: "false", + displayName: LocalizableString + .Create("ExcelReporting"), + valueType: new ToggleStringValueType() + ); + } + } +} +``` + +The example above defines a *Reporting* feature with two children: *PDF Reporting* and *Excel Reporting*. ### Changing Features Definitions of a Depended Module From 36f8bb65a98aa26cfe48b4735534b9629da1ea83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 7 Sep 2020 21:58:30 +0300 Subject: [PATCH 082/116] Add link to the angular UI doc for the permissions and revise some sections. --- docs/en/Authorization.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/docs/en/Authorization.md b/docs/en/Authorization.md index 4b7502f437..eef4237039 100644 --- a/docs/en/Authorization.md +++ b/docs/en/Authorization.md @@ -80,6 +80,8 @@ namespace Acme.BookStore.Permissions > ABP automatically discovers this class. No additional configuration required! +> You typically define this class inside the `Application.Contracts` project of your [application](Startup-Templates/Application.md). The startup template already comes with an empty class named *YourProjectNamePermissionDefinitionProvider* that you can start with. + In the `Define` method, you first need to add a **permission group** or get an existing group then add **permissions** to this group. When you define a permission, it becomes usable in the ASP.NET Core authorization system as a **policy** name. It also becomes visible in the UI. See permissions dialog for a role: @@ -276,14 +278,24 @@ public async Task CreateAsync(CreateAuthorDto input) > Tip: Prefer to use the `Authorize` attribute wherever possible, since it is declarative & simple. Use `IAuthorizationService` if you need to conditionally check a permission and run a business code based on the permission check. -### Check a Permission in JavaScript +## Check a Permission in JavaScript + +You may need to check a policy/permission on the client side. + +### MVC UI -You may need to check a policy/permission on the client side. For ASP.NET Core MVC / Razor Pages applications, you can use the `abp.auth` API. Example: +For ASP.NET Core MVC / Razor Pages applications, you can use the `abp.auth` API. + +**Example: Check if a given permission has been granted for the current user** ```js abp.auth.isGranted('MyPermissionName'); ``` +### Angular UI + +See the [permission management document](UI/Angular/Permission-Management.md) for the Angular UI. + ## Permission Management Permission management is normally done by an admin user using the permission management modal: @@ -374,7 +386,7 @@ Configure(options => ### Permission Store -`IPermissionStore` is the only interface that needs to be implemented to read the value of permissions from a persistence source, generally a database system. Permission management module implements it. See the [permission management module documentation](Modules/Permission-Management.md) for more information +`IPermissionStore` is the only interface that needs to be implemented to read the value of permissions from a persistence source, generally a database system. The Permission Management module implements it and pre-installed in the application startup template. See the [permission management module documentation](Modules/Permission-Management.md) for more information ### AlwaysAllowAuthorizationService From 8e45c9a240b9930eede375fc0470de51ee5b4673 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 7 Sep 2020 21:58:42 +0300 Subject: [PATCH 083/116] Add Feature Store section. --- docs/en/Features.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/Features.md b/docs/en/Features.md index 963f15a9b7..35ba5a0de0 100644 --- a/docs/en/Features.md +++ b/docs/en/Features.md @@ -306,7 +306,7 @@ The example above defines a *Reporting* feature with two children: *PDF Reportin TODO -### Check a Permission in the Client Side +## Check a Permission in the Client Side TODO @@ -324,4 +324,4 @@ TODO ### Feature Store -TODO \ No newline at end of file +`IFeatureStore` is the only interface that needs to be implemented to read the value of features from a persistence source, generally a database system. The Feature Management module implements it and pre-installed in the application startup template. See the [feature management module documentation](https://docs.abp.io/en/abp/latest/Modules/Feature-Management) for more information \ No newline at end of file From 0bae2564c127e359247e5ec87ba510eaf6f311c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 8 Sep 2020 10:27:01 +0300 Subject: [PATCH 084/116] Create Angular UI features page --- docs/en/UI/Angular/Features.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 docs/en/UI/Angular/Features.md diff --git a/docs/en/UI/Angular/Features.md b/docs/en/UI/Angular/Features.md new file mode 100644 index 0000000000..f749030a26 --- /dev/null +++ b/docs/en/UI/Angular/Features.md @@ -0,0 +1,3 @@ +# Angular UI: Features + +> This document explains how to get feature values in an Angular application. See the [Features document](../../Features.md) to learn the feature system. \ No newline at end of file From 00c5114b1e3ec8d52b4bdc0243bfdf34c6f6f14e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 8 Sep 2020 10:29:04 +0300 Subject: [PATCH 085/116] Added sections to the features document --- docs/en/Features.md | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/docs/en/Features.md b/docs/en/Features.md index 35ba5a0de0..1ab26a113a 100644 --- a/docs/en/Features.md +++ b/docs/en/Features.md @@ -304,11 +304,38 @@ The example above defines a *Reporting* feature with two children: *PDF Reportin ### Changing Features Definitions of a Depended Module -TODO +A class deriving from the `FeatureDefinitionProvider` (just like the example above) can also get the existing permission definitions (defined by the depended [modules](Module-Development-Basics.md)) and change their definitions. -## Check a Permission in the Client Side +**Example: Manipulate an existing feature definition** -TODO +```csharp +var someGroup = context.GetGroupOrNull("SomeModule"); +var feature = someGroup.Features.FirstOrDefault(f => f.Name == "SomeFeature"); +if (feature != null) +{ + feature.Description = ... + feature.CreateChild(...); +} +``` + +## Check a Feature in the Client Side + +A feature value is available at the client side too, unless you set `IsVisibleToClients` to `false` on the feature definition. The feature values are exposed from the [Application Configuration API](API/Application-Configuration.md) and usable via some services on the UI. + +### ASP.NET Core MVC / Razor Pages UI + +Use `abp.features` API to get the feature values. + +**Example: Get feature values in the JavaScript code** + +````js +var isEnabled = abp.features.values["MyApp.ExcelReporting"] === "true"; +var count = abp.features.values["MyApp.MaxProductCount"]; +```` + +### Angular UI + +See the [features](Features.md) document for the Angular UI. ## Feature Management From fcdcc3e6708feaaf8532a655106f65fe4940fafd Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 8 Sep 2020 10:39:55 +0300 Subject: [PATCH 086/116] feat: create replaceable-components.service --- .../packages/core/src/lib/services/index.ts | 1 + .../replaceable-components.service.ts | 65 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 npm/ng-packs/packages/core/src/lib/services/replaceable-components.service.ts diff --git a/npm/ng-packs/packages/core/src/lib/services/index.ts b/npm/ng-packs/packages/core/src/lib/services/index.ts index c084fd4808..d3d13de20b 100644 --- a/npm/ng-packs/packages/core/src/lib/services/index.ts +++ b/npm/ng-packs/packages/core/src/lib/services/index.ts @@ -9,6 +9,7 @@ export * from './localization.service'; export * from './multi-tenancy.service'; export * from './profile-state.service'; export * from './profile.service'; +export * from './replaceable-components.service'; export * from './rest.service'; export * from './routes.service'; export * from './session-state.service'; diff --git a/npm/ng-packs/packages/core/src/lib/services/replaceable-components.service.ts b/npm/ng-packs/packages/core/src/lib/services/replaceable-components.service.ts new file mode 100644 index 0000000000..418e608c49 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/services/replaceable-components.service.ts @@ -0,0 +1,65 @@ +import { Injectable, NgZone } from '@angular/core'; +import { Router } from '@angular/router'; +import { ReplaceableComponents } from '../models/replaceable-components'; +import { BehaviorSubject, Observable } from 'rxjs'; +import { noop } from '../utils/common-utils'; +import { map, filter } from 'rxjs/operators'; + +@Injectable({ providedIn: 'root' }) +export class ReplaceableComponentsService { + private components$ = new BehaviorSubject([]); + + get replaceableComponents$(): Observable { + return this.components$.asObservable(); + } + + get replaceableComponents(): ReplaceableComponents.ReplaceableComponent[] { + return this.components$.value; + } + + constructor(private ngZone: NgZone, private router: Router) {} + + // TODO: Create a shared service for route reload and more + private reloadRoute() { + const { shouldReuseRoute } = this.router.routeReuseStrategy; + const setRouteReuse = (reuse: typeof shouldReuseRoute) => { + this.router.routeReuseStrategy.shouldReuseRoute = reuse; + }; + + setRouteReuse(() => false); + this.router.navigated = false; + + this.ngZone.run(async () => { + await this.router.navigateByUrl(this.router.url).catch(noop); + setRouteReuse(shouldReuseRoute); + }); + } + + add(replaceableComponent: ReplaceableComponents.ReplaceableComponent, reload?: boolean): void { + let replaceableComponents = this.components$.value; + + const index = replaceableComponents.findIndex( + component => component.key === replaceableComponent.key, + ); + + if (index > -1) { + replaceableComponents[index] = replaceableComponent; + } else { + replaceableComponents = [...replaceableComponents, replaceableComponent]; + } + + this.components$.next(replaceableComponents); + + if (reload) this.reloadRoute(); + } + + get(replaceableComponentKey: string): ReplaceableComponents.ReplaceableComponent { + return this.replaceableComponents.find(component => component.key === replaceableComponentKey); + } + + get$(replaceableComponentKey: string): Observable { + return this.replaceableComponents$.pipe( + map(components => components.find(component => component.key === replaceableComponentKey)), + ); + } +} From a2f6235225001958db5151dbf4f2217c2c0d8d18 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 8 Sep 2020 10:40:27 +0300 Subject: [PATCH 087/116] chore: deprecate replaceable-components.state --- .../actions/replaceable-components.actions.ts | 3 +- .../states/replaceable-components.state.ts | 30 ++++++------------- 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts b/npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts index 8df6a384ad..a800ab858a 100644 --- a/npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts +++ b/npm/ng-packs/packages/core/src/lib/actions/replaceable-components.actions.ts @@ -1,7 +1,8 @@ import { ReplaceableComponents } from '../models/replaceable-components'; +// tslint:disable: max-line-length /** - * @see usage: https://github.com/abpframework/abp/pull/2522#issue-358333183 + * @deprecated To be deleted in v4.0. Use ReplaceableComponentsService instead. See the doc (https://docs.abp.io/en/abp/latest/UI/Angular/Component-Replacement) */ export class AddReplaceableComponent { static readonly type = '[ReplaceableComponents] Add'; diff --git a/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts b/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts index 82096c5472..e5caa9f95b 100644 --- a/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts +++ b/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts @@ -1,11 +1,14 @@ -import { Injectable, NgZone } from '@angular/core'; -import { Router } from '@angular/router'; +import { Injectable } from '@angular/core'; import { Action, createSelector, Selector, State, StateContext } from '@ngxs/store'; import snq from 'snq'; import { AddReplaceableComponent } from '../actions/replaceable-components.actions'; import { ReplaceableComponents } from '../models/replaceable-components'; -import { noop } from '../utils/common-utils'; +import { ReplaceableComponentsService } from '../services/replaceable-components.service'; +// tslint:disable: max-line-length +/** + * @deprecated To be deleted in v4.0. Use ReplaceableComponentsService instead. See the doc (https://docs.abp.io/en/abp/latest/UI/Angular/Component-Replacement) + */ @State({ name: 'ReplaceableComponentsState', defaults: { replaceableComponents: [] } as ReplaceableComponents.State, @@ -30,23 +33,7 @@ export class ReplaceableComponentsState { return selector; } - constructor(private ngZone: NgZone, private router: Router) {} - - // TODO: Create a shared service for route reload and more - private reloadRoute() { - const { shouldReuseRoute } = this.router.routeReuseStrategy; - const setRouteReuse = (reuse: typeof shouldReuseRoute) => { - this.router.routeReuseStrategy.shouldReuseRoute = reuse; - }; - - setRouteReuse(() => false); - this.router.navigated = false; - - this.ngZone.run(async () => { - await this.router.navigateByUrl(this.router.url).catch(noop); - setRouteReuse(shouldReuseRoute); - }); - } + constructor(private service: ReplaceableComponentsService) {} @Action(AddReplaceableComponent) replaceableComponentsAction( @@ -69,6 +56,7 @@ export class ReplaceableComponentsState { replaceableComponents, }); - if (reload) this.reloadRoute(); + console.log(this.service); + this.service.add(payload, reload); } } From 7e7d86a745343c2e9c377a1c1e3752a45776c6ed Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 8 Sep 2020 10:42:07 +0300 Subject: [PATCH 088/116] feat: implement the new service to project --- .../components/dynamic-layout.component.ts | 9 ++- .../replaceable-route-container.component.ts | 9 ++- .../replaceable-template.directive.ts | 9 ++- .../tests/dynamic-layout.component.spec.ts | 63 +++++++++---------- .../src/lib/providers/styles.provider.ts | 39 ++++++------ 5 files changed, 61 insertions(+), 68 deletions(-) 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 c47b3c02fd..3d6870f577 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,13 +1,12 @@ import { Component, Injector, Optional, SkipSelf, Type } from '@angular/core'; import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; -import { Store } from '@ngxs/store'; import { eLayoutType } from '../enums/common'; import { ABP } from '../models'; import { ReplaceableComponents } from '../models/replaceable-components'; import { LocalizationService } from '../services/localization.service'; +import { ReplaceableComponentsService } from '../services/replaceable-components.service'; import { RoutesService } from '../services/routes.service'; import { SubscriptionService } from '../services/subscription.service'; -import { ReplaceableComponentsState } from '../states/replaceable-components.state'; import { findRoute, getRoutePath } from '../utils/route-utils'; import { TreeNode } from '../utils/tree-utils'; @@ -37,7 +36,7 @@ export class DynamicLayoutComponent { constructor( injector: Injector, private localizationService: LocalizationService, - private store: Store, + private replaceableComponents: ReplaceableComponentsService, private subscription: SubscriptionService, @Optional() @SkipSelf() dynamicLayoutComponent: DynamicLayoutComponent, ) { @@ -67,7 +66,7 @@ export class DynamicLayoutComponent { if (!expectedLayout) expectedLayout = eLayoutType.empty; const key = this.layouts.get(expectedLayout); - this.layout = this.getComponent(key).component; + this.layout = this.getComponent(key)?.component; } }); @@ -82,6 +81,6 @@ export class DynamicLayoutComponent { } private getComponent(key: string): ReplaceableComponents.ReplaceableComponent { - return this.store.selectSnapshot(ReplaceableComponentsState.getComponent(key)); + return this.replaceableComponents.get(key); } } diff --git a/npm/ng-packs/packages/core/src/lib/components/replaceable-route-container.component.ts b/npm/ng-packs/packages/core/src/lib/components/replaceable-route-container.component.ts index 04c596d398..6c0dabd511 100644 --- a/npm/ng-packs/packages/core/src/lib/components/replaceable-route-container.component.ts +++ b/npm/ng-packs/packages/core/src/lib/components/replaceable-route-container.component.ts @@ -1,10 +1,9 @@ import { Component, OnInit, Type } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngxs/store'; import { distinctUntilChanged } from 'rxjs/operators'; import { ReplaceableComponents } from '../models/replaceable-components'; +import { ReplaceableComponentsService } from '../services/replaceable-components.service'; import { SubscriptionService } from '../services/subscription.service'; -import { ReplaceableComponentsState } from '../states/replaceable-components.state'; @Component({ selector: 'abp-replaceable-route-container', @@ -22,7 +21,7 @@ export class ReplaceableRouteContainerComponent implements OnInit { constructor( private route: ActivatedRoute, - private store: Store, + private replaceableComponents: ReplaceableComponentsService, private subscription: SubscriptionService, ) {} @@ -31,8 +30,8 @@ export class ReplaceableRouteContainerComponent implements OnInit { this.componentKey = (this.route.snapshot.data .replaceableComponent as ReplaceableComponents.RouteData).key; - const component$ = this.store - .select(ReplaceableComponentsState.getComponent(this.componentKey)) + const component$ = this.replaceableComponents + .get$(this.componentKey) .pipe(distinctUntilChanged()); this.subscription.addOne( diff --git a/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts index fd9051c64e..489d1afabc 100644 --- a/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts +++ b/npm/ng-packs/packages/core/src/lib/directives/replaceable-template.directive.ts @@ -10,15 +10,14 @@ import { Type, ViewContainerRef, } from '@angular/core'; -import { Store } from '@ngxs/store'; import compare from 'just-compare'; import { Subscription } from 'rxjs'; import { filter } from 'rxjs/operators'; import snq from 'snq'; import { ABP } from '../models/common'; import { ReplaceableComponents } from '../models/replaceable-components'; +import { ReplaceableComponentsService } from '../services/replaceable-components.service'; import { SubscriptionService } from '../services/subscription.service'; -import { ReplaceableComponentsState } from '../states/replaceable-components.state'; @Directive({ selector: '[abpReplaceableTemplate]', providers: [SubscriptionService] }) export class ReplaceableTemplateDirective implements OnInit, OnChanges { @@ -45,7 +44,7 @@ export class ReplaceableTemplateDirective implements OnInit, OnChanges { private templateRef: TemplateRef, private cfRes: ComponentFactoryResolver, private vcRef: ViewContainerRef, - private store: Store, + private replaceableComponents: ReplaceableComponentsService, private subscription: SubscriptionService, ) { this.context = { @@ -58,8 +57,8 @@ export class ReplaceableTemplateDirective implements OnInit, OnChanges { } ngOnInit() { - const component$ = this.store - .select(ReplaceableComponentsState.getComponent(this.data.componentKey)) + const component$ = this.replaceableComponents + .get$(this.data.componentKey) .pipe( filter( (res = {} as ReplaceableComponents.ReplaceableComponent) => diff --git a/npm/ng-packs/packages/core/src/lib/tests/dynamic-layout.component.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/dynamic-layout.component.spec.ts index 4d5f53a9ba..43ad6f87b1 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/dynamic-layout.component.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/dynamic-layout.component.spec.ts @@ -7,7 +7,11 @@ import { NEVER } from 'rxjs'; import { DynamicLayoutComponent, RouterOutletComponent } from '../components'; import { eLayoutType } from '../enums/common'; import { ABP } from '../models'; -import { ApplicationConfigurationService, RoutesService } from '../services'; +import { + ApplicationConfigurationService, + RoutesService, + ReplaceableComponentsService, +} from '../services'; import { ReplaceableComponentsState } from '../states'; @Component({ @@ -78,33 +82,7 @@ const routes: ABP.Route[] = [ }, ]; -const storeData = { - ReplaceableComponentsState: { - replaceableComponents: [ - { - key: 'Theme.ApplicationLayoutComponent', - component: DummyApplicationLayoutComponent, - }, - { - key: 'Theme.AccountLayoutComponent', - component: DummyAccountLayoutComponent, - }, - { - key: 'Theme.EmptyLayoutComponent', - component: DummyEmptyLayoutComponent, - }, - ], - }, -}; - describe('DynamicLayoutComponent', () => { - const mockActions: Actions = NEVER; - const mockStore = ({ - selectSnapshot() { - return true; - }, - } as unknown) as Store; - const createComponent = createRoutingFactory({ component: RouterOutletComponent, stubsEnabled: false, @@ -113,10 +91,16 @@ describe('DynamicLayoutComponent', () => { providers: [ { provide: RoutesService, - useFactory: () => new RoutesService(mockActions, mockStore), + useFactory: () => + new RoutesService(NEVER, ({ + selectSnapshot() { + return true; + }, + } as unknown) as Store), }, + ReplaceableComponentsService, ], - imports: [RouterModule, DummyLayoutModule, NgxsModule.forRoot([ReplaceableComponentsState])], + imports: [RouterModule, DummyLayoutModule, NgxsModule.forRoot()], routes: [ { path: '', component: RouterOutletComponent }, { @@ -163,15 +147,26 @@ describe('DynamicLayoutComponent', () => { }); let spectator: SpectatorRouting; - let store: Store; + let replaceableComponents: ReplaceableComponentsService; beforeEach(async () => { spectator = createComponent(); - store = spectator.inject(Store); + replaceableComponents = spectator.inject(ReplaceableComponentsService); const routesService = spectator.inject(RoutesService); routesService.add(routes); - store.reset(storeData); + replaceableComponents.add({ + key: 'Theme.ApplicationLayoutComponent', + component: DummyApplicationLayoutComponent, + }); + replaceableComponents.add({ + key: 'Theme.AccountLayoutComponent', + component: DummyAccountLayoutComponent, + }); + replaceableComponents.add({ + key: 'Theme.EmptyLayoutComponent', + component: DummyEmptyLayoutComponent, + }); }); it('should handle application layout from parent abp route and display it', async () => { @@ -204,8 +199,8 @@ describe('DynamicLayoutComponent', () => { }); it('should not display any layout when layouts are empty', async () => { - store.reset({ ...storeData, ReplaceableComponentsState: {} }); - + const spy = jest.spyOn(replaceableComponents, 'get'); + spy.mockReturnValue(null); spectator.detectChanges(); spectator.router.navigateByUrl('/withoutLayout'); diff --git a/npm/ng-packs/packages/theme-basic/src/lib/providers/styles.provider.ts b/npm/ng-packs/packages/theme-basic/src/lib/providers/styles.provider.ts index ab6ea9cd1e..b823503912 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/providers/styles.provider.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/providers/styles.provider.ts @@ -1,4 +1,4 @@ -import { AddReplaceableComponent, CONTENT_STRATEGY, DomInsertionService } from '@abp/ng.core'; +import { ReplaceableComponentsService, CONTENT_STRATEGY, DomInsertionService } from '@abp/ng.core'; import { APP_INITIALIZER } from '@angular/core'; import { Store } from '@ngxs/store'; import { AccountLayoutComponent } from '../components/account-layout/account-layout.component'; @@ -11,32 +11,33 @@ export const BASIC_THEME_STYLES_PROVIDERS = [ { provide: APP_INITIALIZER, useFactory: configureStyles, - deps: [DomInsertionService, Store], + deps: [DomInsertionService, ReplaceableComponentsService], multi: true, }, ]; -export function configureStyles(domInsertion: DomInsertionService, store: Store) { +export function configureStyles( + domInsertion: DomInsertionService, + replaceableComponents: ReplaceableComponentsService, +) { return () => { domInsertion.insertContent(CONTENT_STRATEGY.AppendStyleToHead(styles)); - initLayouts(store); + initLayouts(replaceableComponents); }; } -function initLayouts(store: Store) { - store.dispatch([ - new AddReplaceableComponent({ - key: eThemeBasicComponents.ApplicationLayout, - component: ApplicationLayoutComponent, - }), - new AddReplaceableComponent({ - key: eThemeBasicComponents.AccountLayout, - component: AccountLayoutComponent, - }), - new AddReplaceableComponent({ - key: eThemeBasicComponents.EmptyLayout, - component: EmptyLayoutComponent, - }), - ]); +function initLayouts(replaceableComponents: ReplaceableComponentsService) { + replaceableComponents.add({ + key: eThemeBasicComponents.ApplicationLayout, + component: ApplicationLayoutComponent, + }); + replaceableComponents.add({ + key: eThemeBasicComponents.AccountLayout, + component: AccountLayoutComponent, + }); + replaceableComponents.add({ + key: eThemeBasicComponents.EmptyLayout, + component: EmptyLayoutComponent, + }); } From 731539ef84a655c47e92891417aa1a72dafc236a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 8 Sep 2020 10:43:42 +0300 Subject: [PATCH 089/116] Added Feature Management section. --- docs/en/Features.md | 35 +++++++++++++++++++++++- docs/en/Modules/Feature-Management.md | 2 ++ docs/en/Modules/Permission-Management.md | 2 ++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/docs/en/Features.md b/docs/en/Features.md index 1ab26a113a..05712eb803 100644 --- a/docs/en/Features.md +++ b/docs/en/Features.md @@ -170,6 +170,8 @@ namespace FeaturesDemo > ABP automatically discovers this class and registers the features. No additional configuration required. +> This class is generally created in the `Application.Contracts` project of your solution. + * In the `Define` method, you first need to add a **feature group** for your application/module or get an existing group then add **features** to this group. * First feature, named `MyApp.PdfReporting`, is a `boolean` feature with `false` as the default value. * Second feature, named `MyApp.MaxProductCount`, is a numeric feature with `10` as the default value. @@ -339,7 +341,38 @@ See the [features](Features.md) document for the Angular UI. ## Feature Management -TODO +Feature management is normally done by an admin user using the feature management modal: + +![features-modal](images/features-modal.png) + +This modal is available on the related entities, like tenants in a multi-tenant application. To open it, navigate to the **Tenant Management** page (for a multi-tenant application), click to the **Actions** button left to the Tenant and select the **Features** action. + +If you need to manage features by code, inject the `IFeatureManager` service. + +**Example: Enable PDF reporting for a tenant** + +```csharp +public class MyService : ITransientDependency +{ + private readonly IFeatureManager _featureManager; + + public MyService(IFeatureManager featureManager) + { + _featureManager = featureManager; + } + + public async Task EnablePdfReporting(Guid tenantId) + { + await _featureManager.SetForTenantAsync( + tenantId, + "MyApp.PdfReporting", + true.ToString() + ); + } +} +``` + +`IFeatureManager` is defined by the Feature Management module. It comes pre-installed with the application startup template. See the [feature management module documentation](Modules/Feature-Management.md) for more information. ## Advanced Topics diff --git a/docs/en/Modules/Feature-Management.md b/docs/en/Modules/Feature-Management.md index 5c41277dd8..968b742092 100644 --- a/docs/en/Modules/Feature-Management.md +++ b/docs/en/Modules/Feature-Management.md @@ -1,3 +1,5 @@ # Feature Management Module +> This module implements the `IFeatureStore` to store and manage feature values in a database. See the [Features System document](../Features.md) to understand the features first. + TODO \ No newline at end of file diff --git a/docs/en/Modules/Permission-Management.md b/docs/en/Modules/Permission-Management.md index faa03eecc9..ad48b60171 100644 --- a/docs/en/Modules/Permission-Management.md +++ b/docs/en/Modules/Permission-Management.md @@ -1,3 +1,5 @@ # Permission Management Module +This module implements the `IPermissionStore` to store and manage feature values in a database. See the [Authorization document](../Authorization.md) to understand the authorization and permission systems first. + TODO \ No newline at end of file From 5c173a692e6d927d82688cca0c446f054d0fcf63 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 8 Sep 2020 15:54:12 +0800 Subject: [PATCH 090/116] Group features on the feature management modal --- .../Abp/Features/FeatureDefinitionManager.cs | 9 +- .../Abp/Features/IFeatureDefinitionManager.cs | 4 +- .../Abp/FeatureManagement/FeatureGroupDto.cs | 18 ++++ .../Abp/FeatureManagement/FeatureListDto.cs | 9 -- .../GetFeatureListResultDto.cs | 9 ++ .../FeatureManagement/IFeatureAppService.cs | 2 +- .../FeatureManagement/FeatureAppService.cs | 55 +++++++---- .../FeatureManagement/FeaturesController.cs | 2 +- .../FeatureManagementModal.cshtml | 98 +++++++++++-------- .../FeatureManagementModal.cshtml.cs | 19 +++- .../FeatureAppService_Tests.cs | 4 +- .../StringValueJsonConverter_Tests.cs | 82 +++++++++------- 12 files changed, 190 insertions(+), 121 deletions(-) create mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureGroupDto.cs delete mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureListDto.cs create mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/GetFeatureListResultDto.cs diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinitionManager.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinitionManager.cs index f8e8d9e9fe..31498e0756 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinitionManager.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinitionManager.cs @@ -62,6 +62,11 @@ namespace Volo.Abp.Features return FeatureDefinitions.GetOrDefault(name); } + public IReadOnlyList GetGroups() + { + return FeatureGroupDefinitions.Values.ToImmutableList(); + } + protected virtual Dictionary CreateFeatureDefinitions() { var features = new Dictionary(); @@ -78,7 +83,7 @@ namespace Volo.Abp.Features } protected virtual void AddFeatureToDictionaryRecursively( - Dictionary features, + Dictionary features, FeatureDefinition feature) { if (features.ContainsKey(feature.Name)) @@ -114,4 +119,4 @@ namespace Volo.Abp.Features return context.Groups; } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/IFeatureDefinitionManager.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/IFeatureDefinitionManager.cs index c0172d7bc3..ca0a8cbcc6 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/IFeatureDefinitionManager.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/IFeatureDefinitionManager.cs @@ -11,5 +11,7 @@ namespace Volo.Abp.Features IReadOnlyList GetAll(); FeatureDefinition GetOrNull(string name); + + IReadOnlyList GetGroups(); } -} \ No newline at end of file +} diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureGroupDto.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureGroupDto.cs new file mode 100644 index 0000000000..dea10fd298 --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureGroupDto.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; + +namespace Volo.Abp.FeatureManagement +{ + public class FeatureGroupDto + { + public string Name { get; set; } + + public string DisplayName { get; set; } + + public List Features { get; set; } + + public string GetNormalizedGroupName() + { + return Name.Replace(".", "_"); + } + } +} diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureListDto.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureListDto.cs deleted file mode 100644 index ee7bad8d5c..0000000000 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureListDto.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Collections.Generic; - -namespace Volo.Abp.FeatureManagement -{ - public class FeatureListDto - { - public List Features { get; set; } - } -} \ No newline at end of file diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/GetFeatureListResultDto.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/GetFeatureListResultDto.cs new file mode 100644 index 0000000000..86329598cc --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/GetFeatureListResultDto.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Volo.Abp.FeatureManagement +{ + public class GetFeatureListResultDto + { + public List Groups { get; set; } + } +} diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/IFeatureAppService.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/IFeatureAppService.cs index 2c337f1b2a..00c36b7f55 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/IFeatureAppService.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/IFeatureAppService.cs @@ -6,7 +6,7 @@ namespace Volo.Abp.FeatureManagement { public interface IFeatureAppService : IApplicationService { - Task GetAsync([NotNull] string providerName, [NotNull] string providerKey); + Task GetAsync([NotNull] string providerName, [NotNull] string providerKey); Task UpdateAsync([NotNull] string providerName, [NotNull] string providerKey, UpdateFeaturesDto input); } 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 f0c310650d..dbe649e51f 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 @@ -4,6 +4,7 @@ using System.Threading.Tasks; using JetBrains.Annotations; using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Options; +using Volo.Abp.Authorization.Permissions; using Volo.Abp.Features; namespace Volo.Abp.FeatureManagement @@ -24,35 +25,49 @@ namespace Volo.Abp.FeatureManagement Options = options.Value; } - public virtual async Task GetAsync([NotNull] string providerName, [NotNull] string providerKey) + public virtual async Task GetAsync([NotNull] string providerName, [NotNull] string providerKey) { await CheckProviderPolicy(providerName); - var featureDefinitions = FeatureDefinitionManager.GetAll(); - var features = new List(); + var result = new GetFeatureListResultDto + { + Groups = new List() + }; - foreach (var featureDefinition in featureDefinitions) + foreach (var group in FeatureDefinitionManager.GetGroups()) { - var feature = await FeatureManager.GetOrNullWithProviderAsync(featureDefinition.Name, providerName, providerKey); - features.Add(new FeatureDto + var groupDto = new FeatureGroupDto + { + Name = group.Name, + DisplayName = group.DisplayName.Localize(StringLocalizerFactory), + Features = new List() + }; + + foreach (var featureDefinition in group.GetFeaturesWithChildren()) { - Name = featureDefinition.Name, - DisplayName = featureDefinition.DisplayName?.Localize(StringLocalizerFactory), - ValueType = featureDefinition.ValueType, - Description = featureDefinition.Description?.Localize(StringLocalizerFactory), - ParentName = featureDefinition.Parent?.Name, - Value = feature.Value, - Provider = new FeatureProviderDto + var feature = await FeatureManager.GetOrNullWithProviderAsync(featureDefinition.Name, providerName, providerKey); + groupDto.Features.Add(new FeatureDto { - Name = feature.Provider?.Name, - Key = feature.Provider?.Key - } - }); - } + Name = featureDefinition.Name, + DisplayName = featureDefinition.DisplayName?.Localize(StringLocalizerFactory), + ValueType = featureDefinition.ValueType, + Description = featureDefinition.Description?.Localize(StringLocalizerFactory), + ParentName = featureDefinition.Parent?.Name, + Value = feature.Value, + Provider = new FeatureProviderDto + { + Name = feature.Provider?.Name, + Key = feature.Provider?.Key + } + }); + } + + SetFeatureDepth(groupDto.Features, providerName, providerKey); - SetFeatureDepth(features, providerName, providerKey); + result.Groups.Add(groupDto); + } - return new FeatureListDto { Features = features }; + return result; } public virtual async Task UpdateAsync([NotNull] string providerName, [NotNull] string providerKey, UpdateFeaturesDto input) 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 0ae78ed03f..cc00fb370b 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 @@ -17,7 +17,7 @@ namespace Volo.Abp.FeatureManagement } [HttpGet] - public virtual Task GetAsync(string providerName, string providerKey) + public virtual Task GetAsync(string providerName, string providerKey) { return FeatureAppService.GetAsync(providerName, providerKey); } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml index f5adbf79d4..601926b193 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml @@ -4,7 +4,6 @@ @using Volo.Abp.FeatureManagement.Localization @using Volo.Abp.Validation.StringValues @using Volo.Abp.FeatureManagement.Web.Pages.FeatureManagement -@using Volo.Abp.Features @model FeatureManagementModal @inject IHtmlLocalizer L @{ @@ -13,53 +12,67 @@
    - @if (Model.FeatureListDto?.Features != null && Model.FeatureListDto.Features.Any()) + @if (Model.FeatureListResultDto != null && Model.FeatureListResultDto.Groups.Any()) { - - - @for (var i = 0; i < Model.FeatureListDto.Features.Count; i++) - { - var feature = Model.FeatureListDto.Features[i]; - var disabled = Model.IsDisabled(feature.Provider.Name); -
    + + + + @for (var i = 0; i < Model.FeatureListResultDto.Groups.Count; i++) + { + +

    @Model.FeatureListResultDto.Groups[i].DisplayName

    +
    +
    +
    + @for (var j = 0; j < Model.FeatureListResultDto.Groups[i].Features.Count; j++) + { + var feature = Model.FeatureListResultDto.Groups[i].Features[j]; + var disabled = Model.IsDisabled(feature.Provider.Name); +
    - @feature.DisplayName @(disabled ? $"({feature.Provider.Name})" : "") + @feature.DisplayName @(disabled ? $"({feature.Provider.Name})" : "") - - - @if (feature.ValueType is FreeTextStringValueType) - { - - - } - @if (feature.ValueType is SelectionStringValueType) - { - - + + @if (feature.ValueType is FreeTextStringValueType) + { + + + } + @if (feature.ValueType is SelectionStringValueType) + { + + + } + @if (feature.ValueType is ToggleStringValueType) + { + + + } +
    } - } - - } - @if (feature.ValueType is ToggleStringValueType) - { - - - } -
    - } +
    +
    + + } + +
    - + } else { @@ -69,4 +82,3 @@ }
    - diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs index e46d686e69..1464a1fc9b 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs @@ -22,9 +22,9 @@ namespace Volo.Abp.FeatureManagement.Web.Pages.FeatureManagement public string ProviderKey { get; set; } [BindProperty] - public List Features { get; set; } + public List FeatureGroups { get; set; } - public FeatureListDto FeatureListDto { get; set; } + public GetFeatureListResultDto FeatureListResultDto { get; set; } protected IFeatureAppService FeatureAppService { get; } @@ -35,16 +35,20 @@ namespace Volo.Abp.FeatureManagement.Web.Pages.FeatureManagement FeatureAppService = featureAppService; } - public virtual async Task OnGetAsync() + public virtual async Task OnGetAsync() { - FeatureListDto = await FeatureAppService.GetAsync(ProviderName, ProviderKey); + ValidateModel(); + + FeatureListResultDto = await FeatureAppService.GetAsync(ProviderName, ProviderKey); + + return Page(); } public virtual async Task OnPostAsync() { var features = new UpdateFeaturesDto { - Features = Features.Select(f => new UpdateFeatureDto + Features = FeatureGroups.SelectMany(g => g.Features).Select(f => new UpdateFeatureDto { Name = f.Name, Value = f.Type == nameof(ToggleStringValueType) ? f.BoolValue.ToString() : f.Value @@ -68,6 +72,11 @@ namespace Volo.Abp.FeatureManagement.Web.Pages.FeatureManagement public string ProviderKey { get; set; } } + public class FeatureGroupViewModel + { + public List Features { get; set; } + } + public class FeatureViewModel { public string Name { get; set; } diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/FeatureAppService_Tests.cs b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/FeatureAppService_Tests.cs index b257f873cd..2f904a46d2 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/FeatureAppService_Tests.cs +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/FeatureAppService_Tests.cs @@ -41,7 +41,7 @@ namespace Volo.Abp.FeatureManagement TestEditionIds.Regular.ToString()); featureList.ShouldNotBeNull(); - featureList.Features.ShouldContain(feature => feature.Name == TestFeatureDefinitionProvider.SocialLogins); + featureList.Groups.SelectMany(g =>g .Features).ShouldContain(feature => feature.Name == TestFeatureDefinitionProvider.SocialLogins); } [Fact] @@ -63,7 +63,7 @@ namespace Volo.Abp.FeatureManagement }); (await _featureAppService.GetAsync(EditionFeatureValueProvider.ProviderName, - TestEditionIds.Regular.ToString())).Features.Any(x => + TestEditionIds.Regular.ToString())).Groups.SelectMany(g => g.Features).Any(x => x.Name == TestFeatureDefinitionProvider.SocialLogins && x.Value == false.ToString().ToLowerInvariant()) .ShouldBeTrue(); diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/StringValueJsonConverter_Tests.cs b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/StringValueJsonConverter_Tests.cs index 528e0de5e8..1b7553b773 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/StringValueJsonConverter_Tests.cs +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/StringValueJsonConverter_Tests.cs @@ -20,38 +20,46 @@ namespace Volo.Abp.FeatureManagement [Fact] public void Should_Serialize_And_Deserialize() { - var featureListDto = new FeatureListDto + var featureListDto = new GetFeatureListResultDto { - Features = new List + Groups = new List { - new FeatureDto + new FeatureGroupDto { - ValueType = new FreeTextStringValueType + Name = "MyGroup", + DisplayName = "MyGroup", + Features = new List { - Validator = new BooleanValueValidator() - } - }, - new FeatureDto - { - ValueType = new SelectionStringValueType - { - ItemSource = new StaticSelectionStringValueItemSource( - new LocalizableSelectionStringValueItem + new FeatureDto + { + ValueType = new FreeTextStringValueType { - Value = "TestValue", - DisplayText = new LocalizableStringInfo("TestResourceName", "TestName") - }), - Validator = new AlwaysValidValueValidator() - } - }, - new FeatureDto - { - ValueType = new ToggleStringValueType - { - Validator = new NumericValueValidator + Validator = new BooleanValueValidator() + } + }, + new FeatureDto { - MaxValue = 1000, - MinValue = 10 + ValueType = new SelectionStringValueType + { + ItemSource = new StaticSelectionStringValueItemSource( + new LocalizableSelectionStringValueItem + { + Value = "TestValue", + DisplayText = new LocalizableStringInfo("TestResourceName", "TestName") + }), + Validator = new AlwaysValidValueValidator() + } + }, + new FeatureDto + { + ValueType = new ToggleStringValueType + { + Validator = new NumericValueValidator + { + MaxValue = 1000, + MinValue = 10 + } + } } } } @@ -59,22 +67,22 @@ namespace Volo.Abp.FeatureManagement }; var serialized = _jsonSerializer.Serialize(featureListDto, indented: true); - var featureListDto2 = _jsonSerializer.Deserialize(serialized); + var featureListDto2 = _jsonSerializer.Deserialize(serialized); - featureListDto2.Features[0].ValueType.ShouldBeOfType(); - featureListDto2.Features[0].ValueType.Validator.ShouldBeOfType(); + featureListDto2.Groups[0].Features[0].ValueType.ShouldBeOfType(); + featureListDto2.Groups[0].Features[0].ValueType.Validator.ShouldBeOfType(); - featureListDto2.Features[1].ValueType.ShouldBeOfType(); - featureListDto2.Features[1].ValueType.Validator.ShouldBeOfType(); - featureListDto2.Features[1].ValueType.As().ItemSource.Items.ShouldBeOfType(); - featureListDto2.Features[1].ValueType.As().ItemSource.Items.ShouldContain(x => + featureListDto2.Groups[0].Features[1].ValueType.ShouldBeOfType(); + featureListDto2.Groups[0].Features[1].ValueType.Validator.ShouldBeOfType(); + featureListDto2.Groups[0].Features[1].ValueType.As().ItemSource.Items.ShouldBeOfType(); + featureListDto2.Groups[0].Features[1].ValueType.As().ItemSource.Items.ShouldContain(x => x.Value == "TestValue" && x.DisplayText.ResourceName == "TestResourceName" && x.DisplayText.Name == "TestName"); - featureListDto2.Features[2].ValueType.ShouldBeOfType(); - featureListDto2.Features[2].ValueType.Validator.ShouldBeOfType(); - featureListDto2.Features[2].ValueType.Validator.As().MaxValue.ShouldBe(1000); - featureListDto2.Features[2].ValueType.Validator.As().MinValue.ShouldBe(10); + featureListDto2.Groups[0].Features[2].ValueType.ShouldBeOfType(); + featureListDto2.Groups[0].Features[2].ValueType.Validator.ShouldBeOfType(); + featureListDto2.Groups[0].Features[2].ValueType.Validator.As().MaxValue.ShouldBe(1000); + featureListDto2.Groups[0].Features[2].ValueType.Validator.As().MinValue.ShouldBe(10); } } } From 2104c86eab18ce32a0f74ecd6d3356f4d21e9c3b Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 8 Sep 2020 11:07:37 +0300 Subject: [PATCH 091/116] chore: remove console.log --- .../packages/core/src/lib/states/replaceable-components.state.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts b/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts index e5caa9f95b..61a5fef5f6 100644 --- a/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts +++ b/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts @@ -56,7 +56,6 @@ export class ReplaceableComponentsState { replaceableComponents, }); - console.log(this.service); this.service.add(payload, reload); } } From 8fdbab9576574b37b3a112e965c91fe0fe64da09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 8 Sep 2020 11:09:28 +0300 Subject: [PATCH 092/116] Completed the Features document. --- docs/en/Features.md | 67 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 3 deletions(-) diff --git a/docs/en/Features.md b/docs/en/Features.md index 05712eb803..1ec35f730a 100644 --- a/docs/en/Features.md +++ b/docs/en/Features.md @@ -176,6 +176,8 @@ namespace FeaturesDemo * First feature, named `MyApp.PdfReporting`, is a `boolean` feature with `false` as the default value. * Second feature, named `MyApp.MaxProductCount`, is a numeric feature with `10` as the default value. +Default value is used if there is no other value set for the current user/tenant. + ### Other Feature Properties While these minimal definitions are enough to make the feature system working, you can specify the **optional properties** for the features; @@ -376,11 +378,70 @@ public class MyService : ITransientDependency ## Advanced Topics -TODO - ### Feature Value Providers -TODO +Feature system is extensible. Any class derived from `FeatureValueProvider` (or implements `IFeatureValueProvider`) can contribute to the feature system. A value provider is responsible to **obtain the current value** of a given feature. + +Feature value providers are **executed one by one**. If one of them return a non-null value, then this feature value is used and the other providers are not executed. + +There are three pre-defined value providers, executed by the given order: + +* `TenantFeatureValueProvider` tries to get if the feature value is explicitly set for the **current tenant**. +* `EditionFeatureValueProvider` tries to get the feature value for the current edition. Edition Id is obtained from the current principal identity (`ICurrentPrincipalAccessor`) with the claim name `editionid` (a constant defined as`AbpClaimTypes.EditionId`). Editions are not implemented for the [tenant management](Modules/Tenant-Management.md) module. You can implement it yourself or consider to use the [SaaS module](https://commercial.abp.io/modules/Volo.Saas) of the ABP Commercial. +* `DefaultValueFeatureValueProvider` gets the default value of the feature. + +You can write your own provider by inheriting the `FeatureValueProvider`. + +**Example: Enable all features for a user with "SystemAdmin" as a "User_Type" claim value** + +```csharp +using System.Threading.Tasks; +using Volo.Abp.Features; +using Volo.Abp.Security.Claims; +using Volo.Abp.Validation.StringValues; + +namespace FeaturesDemo +{ + public class SystemAdminFeatureValueProvider : FeatureValueProvider + { + public override string Name => "SA"; + + private readonly ICurrentPrincipalAccessor _currentPrincipalAccessor; + + public SystemAdminFeatureValueProvider( + IFeatureStore featureStore, + ICurrentPrincipalAccessor currentPrincipalAccessor) + : base(featureStore) + { + _currentPrincipalAccessor = currentPrincipalAccessor; + } + + public override Task GetOrNullAsync(FeatureDefinition feature) + { + if (feature.ValueType is ToggleStringValueType && + _currentPrincipalAccessor.Principal?.FindFirst("User_Type")?.Value == "SystemAdmin") + { + return Task.FromResult("true"); + } + + return null; + } + } +} +``` + +If a provider returns `null`, then the next provider is executed. + +Once a provider is defined, it should be added to the `AbpFeatureOptions` as shown below: + +```csharp +Configure(options => +{ + options.ValueProviders.Add(); +}); +``` + +Use this code inside the `ConfigureServices` of your [module](Module-Development-Basics.md) class. ### Feature Store From 311287cce9b522f326e16e6138b378b020884251 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 8 Sep 2020 11:14:48 +0300 Subject: [PATCH 093/116] Added Features to the nav menu --- docs/en/Multi-Tenancy.md | 3 +++ docs/en/docs-nav.json | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/docs/en/Multi-Tenancy.md b/docs/en/Multi-Tenancy.md index 901a5c5cff..5138c9de04 100644 --- a/docs/en/Multi-Tenancy.md +++ b/docs/en/Multi-Tenancy.md @@ -369,3 +369,6 @@ options.AddDomainTenantResolver("{0}.mydomain.com"); options.AddDomainTenantResolver("{0}.com"); ```` +## See Also + +* [Features](Features.md) \ No newline at end of file diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index dc872a2279..654bc720e2 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -170,6 +170,10 @@ "text": "Settings", "path": "Settings.md" }, + { + "text": "Features", + "path": "Features.md" + }, { "text": "Data Filtering", "path": "Data-Filtering.md" From 89df9fdde0a3f5a33ae6c4c01001ad4b4469c42f Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 8 Sep 2020 12:05:54 +0300 Subject: [PATCH 094/116] test: fix testing errors --- ...laceable-route-container.component.spec.ts | 18 +++++++-------- .../replaceable-template.directive.spec.ts | 22 +++++++++++-------- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/tests/replaceable-route-container.component.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/replaceable-route-container.component.spec.ts index f5874bca46..16973c17c8 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/replaceable-route-container.component.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/replaceable-route-container.component.spec.ts @@ -5,6 +5,7 @@ import { Store } from '@ngxs/store'; import { of, Subject, BehaviorSubject } from 'rxjs'; import { ReplaceableRouteContainerComponent } from '../components/replaceable-route-container.component'; import { ReplaceableComponentsState } from '../states'; +import { ReplaceableComponentsService } from '../services/replaceable-components.service'; @Component({ selector: 'abp-external-component', @@ -30,16 +31,15 @@ const activatedRouteMock = { }; describe('ReplaceableRouteContainerComponent', () => { - const selectResponse = new BehaviorSubject(undefined); - const mockSelect = jest.fn(() => selectResponse); - let spectator: SpectatorHost; + const get$Res = new BehaviorSubject(undefined); + const replaceableComponents = spectator.inject(ReplaceableComponentsService); + const spy = jest.spyOn(replaceableComponents, 'get$'); + spy.mockReturnValue(get$Res as any); + const createHost = createHostFactory({ component: ReplaceableRouteContainerComponent, - providers: [ - { provide: ActivatedRoute, useValue: activatedRouteMock }, - { provide: Store, useValue: { select: mockSelect } }, - ], + providers: [{ provide: ActivatedRoute, useValue: activatedRouteMock }], declarations: [ExternalComponent, DefaultComponent], entryComponents: [DefaultComponent, ExternalComponent], }); @@ -55,11 +55,11 @@ describe('ReplaceableRouteContainerComponent', () => { }); it("should display the external component if it's available in store.", () => { - selectResponse.next({ component: ExternalComponent }); + get$Res.next({ component: ExternalComponent }); spectator.detectChanges(); expect(spectator.query('p')).toHaveText('external'); - selectResponse.next({ component: null }); + get$Res.next({ component: null }); spectator.detectChanges(); expect(spectator.query('p')).toHaveText('default'); }); diff --git a/npm/ng-packs/packages/core/src/lib/tests/replaceable-template.directive.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/replaceable-template.directive.spec.ts index 613508f56b..2923dd473b 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/replaceable-template.directive.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/replaceable-template.directive.spec.ts @@ -4,6 +4,8 @@ import { Store } from '@ngxs/store'; import { Subject } from 'rxjs'; import { ReplaceableTemplateDirective } from '../directives'; import { ReplaceableComponents } from '../models'; +import { Router } from '@angular/router'; +import { ReplaceableComponentsService } from '../services/replaceable-components.service'; @Component({ selector: 'abp-default-component', @@ -48,15 +50,17 @@ class ExternalComponent { } describe('ReplaceableTemplateDirective', () => { - const selectResponse = new Subject(); - const mockSelect = jest.fn(() => selectResponse); - let spectator: SpectatorDirective; + const get$Res = new Subject(); + + const replaceableComponents = spectator.inject(ReplaceableComponentsService); + const spy = jest.spyOn(replaceableComponents, 'get$'); + spy.mockReturnValue(get$Res as any); const createDirective = createDirectiveFactory({ directive: ReplaceableTemplateDirective, - providers: [{ provide: Store, useValue: { select: mockSelect } }], declarations: [DefaultComponent, ExternalComponent], entryComponents: [ExternalComponent], + mocks: [Router], }); describe('without external component', () => { @@ -72,7 +76,7 @@ describe('ReplaceableTemplateDirective', () => { `, { hostProps: { oneWay: { label: 'Test' }, twoWay: false, twoWayChange, someOutput } }, ); - selectResponse.next(undefined); + get$Res.next(undefined); const component = spectator.query(DefaultComponent); spectator.directive.context.initTemplate(component); spectator.detectChanges(); @@ -114,7 +118,7 @@ describe('ReplaceableTemplateDirective', () => { `, { hostProps: { oneWay: { label: 'Test' }, twoWay: false, twoWayChange, someOutput } }, ); - selectResponse.next({ component: ExternalComponent, key: 'TestModule.TestComponent' }); + get$Res.next({ component: ExternalComponent, key: 'TestModule.TestComponent' }); }); afterEach(() => twoWayChange.mockClear()); @@ -150,7 +154,7 @@ describe('ReplaceableTemplateDirective', () => { const externalComponent = spectator.query(ExternalComponent); spectator.setHostInput({ oneWay: 'test' }); externalComponent.data.inputs.twoWay = true; - selectResponse.next({ component: null, key: 'TestModule.TestComponent' }); + get$Res.next({ component: null, key: 'TestModule.TestComponent' }); spectator.detectChanges(); const component = spectator.query(DefaultComponent); spectator.directive.context.initTemplate(component); @@ -161,14 +165,14 @@ describe('ReplaceableTemplateDirective', () => { }); it('should reset default component subscriptions', () => { - selectResponse.next({ component: null, key: 'TestModule.TestComponent' }); + get$Res.next({ component: null, key: 'TestModule.TestComponent' }); const component = spectator.query(DefaultComponent); spectator.directive.context.initTemplate(component); spectator.detectChanges(); const unsubscribe = jest.fn(() => {}); spectator.directive.defaultComponentSubscriptions.twoWayChange.unsubscribe = unsubscribe; - selectResponse.next({ component: ExternalComponent, key: 'TestModule.TestComponent' }); + get$Res.next({ component: ExternalComponent, key: 'TestModule.TestComponent' }); expect(unsubscribe).toHaveBeenCalled(); }); }); From f5b6ef2388250eb4c742254ff9b0b0331299702d Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 8 Sep 2020 18:06:58 +0800 Subject: [PATCH 095/116] add paged --- .../Volo/Abp/Identity/IOrganizationUnitRepository.cs | 8 ++++++-- .../EfCoreOrganizationUnitRepository.cs | 10 ++++++++-- .../MongoDB/MongoOrganizationUnitRepository.cs | 10 ++++++++-- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IOrganizationUnitRepository.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IOrganizationUnitRepository.cs index 81474425db..4d5bf7d060 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IOrganizationUnitRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IOrganizationUnitRepository.cs @@ -57,8 +57,10 @@ namespace Volo.Abp.Identity Task> GetUnaddedRolesAsync( OrganizationUnit organizationUnit, - string filter = null, string sorting = null, + int maxResultCount = int.MaxValue, + int skipCount = 0, + string filter = null, bool includeDetails = false, CancellationToken cancellationToken = default ); @@ -81,8 +83,10 @@ namespace Volo.Abp.Identity Task> GetUnaddedUsersAsync( OrganizationUnit organizationUnit, - string filter = null, string sorting = null, + int maxResultCount = int.MaxValue, + int skipCount = 0, + string filter = null, bool includeDetails = false, CancellationToken cancellationToken = default ); diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs index d50745ab1d..ebfa9b8ebb 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs @@ -114,8 +114,10 @@ namespace Volo.Abp.Identity.EntityFrameworkCore public virtual async Task> GetUnaddedRolesAsync( OrganizationUnit organizationUnit, - string filter = null, string sorting = null, + int maxResultCount = int.MaxValue, + int skipCount = 0, + string filter = null, bool includeDetails = false, CancellationToken cancellationToken = default) { @@ -126,6 +128,7 @@ namespace Volo.Abp.Identity.EntityFrameworkCore .IncludeDetails(includeDetails) .WhereIf(!filter.IsNullOrWhiteSpace(), r => r.Name.Contains(filter)) .OrderBy(sorting ?? nameof(IdentityRole.Name)) + .PageBy(skipCount, maxResultCount) .ToListAsync(cancellationToken); } @@ -157,8 +160,10 @@ namespace Volo.Abp.Identity.EntityFrameworkCore public virtual async Task> GetUnaddedUsersAsync( OrganizationUnit organizationUnit, - string filter = null, string sorting = null, + int maxResultCount = int.MaxValue, + int skipCount = 0, + string filter = null, bool includeDetails = false, CancellationToken cancellationToken = default) { @@ -181,6 +186,7 @@ namespace Volo.Abp.Identity.EntityFrameworkCore return await query .IncludeDetails(includeDetails) .OrderBy(sorting ?? nameof(IdentityUser.Name)) + .PageBy(skipCount, maxResultCount) .ToListAsync(cancellationToken); } diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoOrganizationUnitRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoOrganizationUnitRepository.cs index 2823c99a6c..2b28a2e3a1 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoOrganizationUnitRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoOrganizationUnitRepository.cs @@ -109,8 +109,10 @@ namespace Volo.Abp.Identity.MongoDB public async Task> GetUnaddedRolesAsync( OrganizationUnit organizationUnit, - string filter = null, string sorting = null, + int maxResultCount = int.MaxValue, + int skipCount = 0, + string filter = null, bool includeDetails = false, CancellationToken cancellationToken = default) { @@ -120,6 +122,7 @@ namespace Volo.Abp.Identity.MongoDB .WhereIf(!filter.IsNullOrWhiteSpace(), r => r.Name.Contains(filter)) .OrderBy(sorting ?? nameof(IdentityRole.Name)) .As>() + .PageBy>(skipCount, maxResultCount) .ToListAsync(cancellationToken); } @@ -153,8 +156,10 @@ namespace Volo.Abp.Identity.MongoDB public async Task> GetUnaddedUsersAsync( OrganizationUnit organizationUnit, - string filter = null, string sorting = null, + int maxResultCount = int.MaxValue, + int skipCount = 0, + string filter = null, bool includeDetails = false, CancellationToken cancellationToken = default) { @@ -169,6 +174,7 @@ namespace Volo.Abp.Identity.MongoDB ) .OrderBy(sorting ?? nameof(IdentityUser.UserName)) .As>() + .PageBy>(skipCount, maxResultCount) .ToListAsync(GetCancellationToken(cancellationToken)); } From 59a6c630be8f9de8cbadbe68f8c328fa55de37d8 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 8 Sep 2020 18:33:59 +0800 Subject: [PATCH 096/116] Add get count method --- .../Identity/IOrganizationUnitRepository.cs | 12 +++++++ .../EfCoreOrganizationUnitRepository.cs | 31 +++++++++++++++++++ .../MongoOrganizationUnitRepository.cs | 29 +++++++++++++++++ .../OrganizationUnitRepository_Tests.cs | 17 ++++++++++ 4 files changed, 89 insertions(+) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IOrganizationUnitRepository.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IOrganizationUnitRepository.cs index 4d5bf7d060..bf39874e00 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IOrganizationUnitRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IOrganizationUnitRepository.cs @@ -65,6 +65,12 @@ namespace Volo.Abp.Identity CancellationToken cancellationToken = default ); + Task GetUnaddedRolesCountAsync( + OrganizationUnit organizationUnit, + string filter = null, + CancellationToken cancellationToken = default + ); + Task> GetMembersAsync( OrganizationUnit organizationUnit, string sorting = null, @@ -91,6 +97,12 @@ namespace Volo.Abp.Identity CancellationToken cancellationToken = default ); + Task GetUnaddedUsersCountAsync( + OrganizationUnit organizationUnit, + string filter = null, + CancellationToken cancellationToken = default + ); + Task RemoveAllRolesAsync( OrganizationUnit organizationUnit, CancellationToken cancellationToken = default diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs index ebfa9b8ebb..59fbd9518e 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreOrganizationUnitRepository.cs @@ -132,6 +132,19 @@ namespace Volo.Abp.Identity.EntityFrameworkCore .ToListAsync(cancellationToken); } + public virtual async Task GetUnaddedRolesCountAsync( + OrganizationUnit organizationUnit, + string filter = null, + CancellationToken cancellationToken = default) + { + var roleIds = organizationUnit.Roles.Select(r => r.RoleId).ToList(); + + return await DbContext.Roles + .Where(r => !roleIds.Contains(r.Id)) + .WhereIf(!filter.IsNullOrWhiteSpace(), r => r.Name.Contains(filter)) + .CountAsync(cancellationToken); + } + public virtual async Task> GetMembersAsync( OrganizationUnit organizationUnit, string sorting = null, @@ -190,6 +203,24 @@ namespace Volo.Abp.Identity.EntityFrameworkCore .ToListAsync(cancellationToken); } + public virtual async Task GetUnaddedUsersCountAsync( + OrganizationUnit organizationUnit, + string filter = null, + CancellationToken cancellationToken = default) + { + var userIdsInOrganizationUnit = DbContext.Set() + .Where(uou => uou.OrganizationUnitId == organizationUnit.Id) + .Select(uou => uou.UserId); + + return await DbContext.Users + .Where(u => !userIdsInOrganizationUnit.Contains(u.Id)) + .WhereIf(!filter.IsNullOrWhiteSpace(), u => + u.UserName.Contains(filter) || + u.Email.Contains(filter) || + (u.PhoneNumber != null && u.PhoneNumber.Contains(filter))) + .CountAsync(cancellationToken); + } + public override IQueryable WithDetails() { return GetQueryable().IncludeDetails(); diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoOrganizationUnitRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoOrganizationUnitRepository.cs index 2b28a2e3a1..10ae4cd038 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoOrganizationUnitRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoOrganizationUnitRepository.cs @@ -126,6 +126,19 @@ namespace Volo.Abp.Identity.MongoDB .ToListAsync(cancellationToken); } + public async Task GetUnaddedRolesCountAsync( + OrganizationUnit organizationUnit, + string filter = null, + CancellationToken cancellationToken = default) + { + var roleIds = organizationUnit.Roles.Select(r => r.RoleId).ToArray(); + return await DbContext.Roles.AsQueryable() + .Where(r => !roleIds.Contains(r.Id)) + .WhereIf(!filter.IsNullOrWhiteSpace(), r => r.Name.Contains(filter)) + .As>() + .CountAsync(cancellationToken); + } + public virtual async Task> GetMembersAsync( OrganizationUnit organizationUnit, string sorting = null, @@ -178,6 +191,22 @@ namespace Volo.Abp.Identity.MongoDB .ToListAsync(GetCancellationToken(cancellationToken)); } + public async Task GetUnaddedUsersCountAsync(OrganizationUnit organizationUnit, string filter = null, + CancellationToken cancellationToken = default) + { + return await DbContext.Users.AsQueryable() + .Where(u => !u.OrganizationUnits.Any(uou => uou.OrganizationUnitId == organizationUnit.Id)) + .WhereIf>( + !filter.IsNullOrWhiteSpace(), + u => + u.UserName.Contains(filter) || + u.Email.Contains(filter) || + (u.PhoneNumber != null && u.PhoneNumber.Contains(filter)) + ) + .As>() + .CountAsync(GetCancellationToken(cancellationToken)); + } + public virtual Task RemoveAllRolesAsync(OrganizationUnit organizationUnit, CancellationToken cancellationToken = default) { organizationUnit.Roles.Clear(); diff --git a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/OrganizationUnitRepository_Tests.cs b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/OrganizationUnitRepository_Tests.cs index 97544cd1e9..a671ba3284 100644 --- a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/OrganizationUnitRepository_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/OrganizationUnitRepository_Tests.cs @@ -305,5 +305,22 @@ namespace Volo.Abp.Identity unaddedRoles.ShouldNotContain(u => u.Name == "moderator"); unaddedRoles.ShouldContain(u => u.Name.Contains("admin")); } + + [Fact] + public async Task GetUnaddedUsersCountOfOrganizationUnitAsync() + { + var ou = await _organizationUnitRepository.GetAsync("OU111", true); + var count = await _organizationUnitRepository.GetUnaddedUsersCountAsync(ou); + count.ShouldBeGreaterThan(0); + + } + + [Fact] + public async Task GetUnaddedRolesCountOfOrganizationUnitAsync() + { + var ou = await _organizationUnitRepository.GetAsync("OU111", true); + var count = await _organizationUnitRepository.GetUnaddedRolesCountAsync(ou); + count.ShouldBeGreaterThan(0); + } } } From 431d02f177153c79ae6330a45c8c27de3d95a1fa Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 8 Sep 2020 14:26:45 +0300 Subject: [PATCH 097/116] chore: add deprecation message logger to replaceable-components.state --- .../lib/states/replaceable-components.state.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts b/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts index 61a5fef5f6..8b861f144e 100644 --- a/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts +++ b/npm/ng-packs/packages/core/src/lib/states/replaceable-components.state.ts @@ -1,10 +1,19 @@ -import { Injectable } from '@angular/core'; +import { Injectable, isDevMode } from '@angular/core'; import { Action, createSelector, Selector, State, StateContext } from '@ngxs/store'; import snq from 'snq'; import { AddReplaceableComponent } from '../actions/replaceable-components.actions'; import { ReplaceableComponents } from '../models/replaceable-components'; import { ReplaceableComponentsService } from '../services/replaceable-components.service'; +function logDeprecationMsg() { + if (isDevMode()) { + console.warn(` + ReplacableComponentsState has been deprecated. Use ReplaceableComponentsService instead. + See the doc https://docs.abp.io/en/abp/latest/UI/Angular/Component-Replacement + `); + } +} + // tslint:disable: max-line-length /** * @deprecated To be deleted in v4.0. Use ReplaceableComponentsService instead. See the doc (https://docs.abp.io/en/abp/latest/UI/Angular/Component-Replacement) @@ -19,6 +28,7 @@ export class ReplaceableComponentsState { static getAll({ replaceableComponents, }: ReplaceableComponents.State): ReplaceableComponents.ReplaceableComponent[] { + logDeprecationMsg(); return replaceableComponents || []; } @@ -26,6 +36,7 @@ export class ReplaceableComponentsState { const selector = createSelector( [ReplaceableComponentsState], (state: ReplaceableComponents.State): ReplaceableComponents.ReplaceableComponent => { + logDeprecationMsg(); return snq(() => state.replaceableComponents.find(component => component.key === key)); }, ); @@ -40,6 +51,8 @@ export class ReplaceableComponentsState { { getState, patchState }: StateContext, { payload, reload }: AddReplaceableComponent, ) { + logDeprecationMsg(); + let { replaceableComponents } = getState(); const index = snq( From d43dc102c76e0f34d2ce2341e9774309ff004c01 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 8 Sep 2020 15:30:40 +0300 Subject: [PATCH 098/116] Update Default.cshtml --- .../Pages/CmsKit/Shared/Components/Commenting/Default.cshtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/Default.cshtml b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/Default.cshtml index ab7fc9805b..f988dd29e7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/Default.cshtml +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/Default.cshtml @@ -175,7 +175,7 @@
    } - @if (comment.Replies.Count >= 5) + @if (comment.Replies.Count >= 3) {
    @if (CurrentUser.IsAuthenticated) From cd91017415ab506d2cd0dafed9f047b4caa2ce38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20=C3=87otur?= Date: Tue, 8 Sep 2020 17:31:32 +0300 Subject: [PATCH 099/116] Update AbpComponentDemoSectionTagHelper.cs --- .../Shared/TagHelpers/AbpComponentDemoSectionTagHelper.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Views/Components/Themes/Shared/TagHelpers/AbpComponentDemoSectionTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Views/Components/Themes/Shared/TagHelpers/AbpComponentDemoSectionTagHelper.cs index 722460992d..1f1f71b066 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Views/Components/Themes/Shared/TagHelpers/AbpComponentDemoSectionTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Views/Components/Themes/Shared/TagHelpers/AbpComponentDemoSectionTagHelper.cs @@ -47,7 +47,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.Views.Components.Themes.S output.PreContent.AppendHtml($"

    {Title}

    "); output.PreContent.AppendHtml("
    "); output.PreContent.AppendHtml("