From 8c9e2260236f6114a73c17ccc0e228cfb413b353 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 8 Sep 2020 11:06:14 +0200 Subject: [PATCH 01/21] Translations fix. --- backend/i18n/source/backend_en.json | 4 ++-- backend/i18n/source/backend_it.json | 4 ++-- backend/i18n/source/backend_nl.json | 4 ++-- backend/src/Squidex.Shared/Texts.it.resx | 4 ++-- backend/src/Squidex.Shared/Texts.nl.resx | 4 ++-- backend/src/Squidex.Shared/Texts.resx | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/backend/i18n/source/backend_en.json b/backend/i18n/source/backend_en.json index 38c862ff6..5a5188d29 100644 --- a/backend/i18n/source/backend_en.json +++ b/backend/i18n/source/backend_en.json @@ -92,9 +92,9 @@ "common.notFoundValue": "- not found -", "common.numDays": "Num days", "common.odataFailure": "Failed to parse query: {message}", - "common.odataFilterNotValid": "OData $filter clause not valid: {ex.Message}", + "common.odataFilterNotValid": "OData $filter clause not valid: {message}", "common.odataNotSupported": "OData operation is not supported.", - "common.odataSearchNotValid": "OData $search clause not valid: {ex.Message}", + "common.odataSearchNotValid": "OData $search clause not valid: {message}", "common.oldPassword": "Old password", "common.other": "Other", "common.partitioning": "Partitioning", diff --git a/backend/i18n/source/backend_it.json b/backend/i18n/source/backend_it.json index 1ffdc1b70..5ccac0775 100644 --- a/backend/i18n/source/backend_it.json +++ b/backend/i18n/source/backend_it.json @@ -82,9 +82,9 @@ "common.notFoundValue": "- non trovato -", "common.numDays": "Num. giorni", "common.odataFailure": "Fallito parsando la query: {message}", - "common.odataFilterNotValid": "OData $filter condizione non valida: {ex.Message}", + "common.odataFilterNotValid": "OData $filter condizione non valida: {message}", "common.odataNotSupported": "OData operazione non supportata.", - "common.odataSearchNotValid": "OData $search condizione non valida: {ex.Message}", + "common.odataSearchNotValid": "OData $search condizione non valida: {message}", "common.oldPassword": "Vecchia password", "common.other": "Altro", "common.partitioning": "Partizionamento", diff --git a/backend/i18n/source/backend_nl.json b/backend/i18n/source/backend_nl.json index 00969f164..3f8a2ba2e 100644 --- a/backend/i18n/source/backend_nl.json +++ b/backend/i18n/source/backend_nl.json @@ -87,9 +87,9 @@ "common.notFoundValue": "- niet gevonden -", "common.numDays": "Aantal dagen", "common.odataFailure": "Ontleden zoekopdracht: {message}", - "common.odataFilterNotValid": "OData $ filterclausule niet geldig: {ex.Message}", + "common.odataFilterNotValid": "OData $ filterclausule niet geldig: {message}", "common.odataNotSupported": "OData-bewerking wordt niet ondersteund.", - "common.odataSearchNotValid": "OData $ zoekclausule niet geldig: {ex.Message}", + "common.odataSearchNotValid": "OData $ zoekclausule niet geldig: {message}", "common.oldPassword": "Oud wachtwoord", "common.other": "Anders", "common.partitioning": "Partitioneren", diff --git a/backend/src/Squidex.Shared/Texts.it.resx b/backend/src/Squidex.Shared/Texts.it.resx index 2a6b14c96..005a0f02c 100644 --- a/backend/src/Squidex.Shared/Texts.it.resx +++ b/backend/src/Squidex.Shared/Texts.it.resx @@ -362,13 +362,13 @@ Fallito parsando la query: {message} - OData $filter condizione non valida: {ex.Message} + OData $filter condizione non valida: {message} OData operazione non supportata. - OData $search condizione non valida: {ex.Message} + OData $search condizione non valida: {message} Vecchia password diff --git a/backend/src/Squidex.Shared/Texts.nl.resx b/backend/src/Squidex.Shared/Texts.nl.resx index f7cad376b..0465d8004 100644 --- a/backend/src/Squidex.Shared/Texts.nl.resx +++ b/backend/src/Squidex.Shared/Texts.nl.resx @@ -362,13 +362,13 @@ Ontleden zoekopdracht: {message} - OData $ filterclausule niet geldig: {ex.Message} + OData $ filterclausule niet geldig: {message} OData-bewerking wordt niet ondersteund. - OData $ zoekclausule niet geldig: {ex.Message} + OData $ zoekclausule niet geldig: {message} Oud wachtwoord diff --git a/backend/src/Squidex.Shared/Texts.resx b/backend/src/Squidex.Shared/Texts.resx index ddc1b1405..9ac34ad5a 100644 --- a/backend/src/Squidex.Shared/Texts.resx +++ b/backend/src/Squidex.Shared/Texts.resx @@ -362,13 +362,13 @@ Failed to parse query: {message} - OData $filter clause not valid: {ex.Message} + OData $filter clause not valid: {message} OData operation is not supported. - OData $search clause not valid: {ex.Message} + OData $search clause not valid: {message} Old password From e2d107fa5f1915b07b636b8c1f75f1e0ae8f52ab Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 8 Sep 2020 11:34:55 +0200 Subject: [PATCH 02/21] Packages updated. --- .../Squidex.Extensions.csproj | 12 ++--- .../Squidex.Domain.Apps.Core.Model.csproj | 4 +- ...Squidex.Domain.Apps.Core.Operations.csproj | 10 ++-- ...quidex.Domain.Apps.Entities.MongoDb.csproj | 2 +- .../Squidex.Domain.Apps.Entities.csproj | 10 ++-- .../MongoPersistedGrantStore.cs | 49 ++++++++++++++++--- .../Squidex.Domain.Users.MongoDb.csproj | 4 +- .../Squidex.Domain.Users.csproj | 2 +- .../Squidex.Infrastructure.Amazon.csproj | 2 +- .../Squidex.Infrastructure.Azure.csproj | 6 +-- ...quidex.Infrastructure.GetEventStore.csproj | 2 +- .../Squidex.Infrastructure.GoogleCloud.csproj | 2 +- .../Squidex.Infrastructure.MongoDb.csproj | 4 +- .../Squidex.Infrastructure.RabbitMq.csproj | 2 +- .../Squidex.Infrastructure.csproj | 26 +++++----- backend/src/Squidex.Web/Squidex.Web.csproj | 2 +- .../IdentityServer/Config/LazyClientStore.cs | 8 +-- backend/src/Squidex/Squidex.csproj | 34 ++++++------- .../Squidex.Domain.Apps.Core.Tests.csproj | 10 ++-- .../Squidex.Domain.Apps.Entities.Tests.csproj | 8 +-- .../Squidex.Domain.Users.Tests.csproj | 6 +-- .../Squidex.Infrastructure.Tests.csproj | 14 +++--- .../Squidex.Web.Tests.csproj | 10 ++-- 23 files changed, 131 insertions(+), 98 deletions(-) diff --git a/backend/extensions/Squidex.Extensions/Squidex.Extensions.csproj b/backend/extensions/Squidex.Extensions/Squidex.Extensions.csproj index 45cd0db46..462397210 100644 --- a/backend/extensions/Squidex.Extensions/Squidex.Extensions.csproj +++ b/backend/extensions/Squidex.Extensions/Squidex.Extensions.csproj @@ -8,15 +8,15 @@ - + - + - - - - + + + + diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Squidex.Domain.Apps.Core.Model.csproj b/backend/src/Squidex.Domain.Apps.Core.Model/Squidex.Domain.Apps.Core.Model.csproj index 6be87fc8b..fe37e1d0a 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Squidex.Domain.Apps.Core.Model.csproj +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Squidex.Domain.Apps.Core.Model.csproj @@ -10,12 +10,12 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj b/backend/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj index 012ce054e..7343aeecf 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj @@ -18,11 +18,11 @@ - - - - - + + + + + diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Squidex.Domain.Apps.Entities.MongoDb.csproj b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Squidex.Domain.Apps.Entities.MongoDb.csproj index 6006e9d5e..d62b093fc 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Squidex.Domain.Apps.Entities.MongoDb.csproj +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Squidex.Domain.Apps.Entities.MongoDb.csproj @@ -17,7 +17,7 @@ - + diff --git a/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj b/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj index ca915e201..34b9440cf 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj +++ b/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj @@ -18,9 +18,9 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -29,12 +29,12 @@ - - + + all runtime; build; native; contentfiles; analyzers - + diff --git a/backend/src/Squidex.Domain.Users.MongoDb/Infrastructure/MongoPersistedGrantStore.cs b/backend/src/Squidex.Domain.Users.MongoDb/Infrastructure/MongoPersistedGrantStore.cs index 928d6a732..541e71345 100644 --- a/backend/src/Squidex.Domain.Users.MongoDb/Infrastructure/MongoPersistedGrantStore.cs +++ b/backend/src/Squidex.Domain.Users.MongoDb/Infrastructure/MongoPersistedGrantStore.cs @@ -10,6 +10,7 @@ using System.Threading; using System.Threading.Tasks; using IdentityServer4.Models; using IdentityServer4.Stores; +using MongoDB.Bson; using MongoDB.Bson.Serialization; using MongoDB.Driver; using Squidex.Infrastructure.MongoDb; @@ -52,9 +53,9 @@ namespace Squidex.Domain.Users.MongoDb.Infrastructure return await Collection.Find(x => x.SubjectId == subjectId).ToListAsync(); } - public Task StoreAsync(PersistedGrant grant) + public async Task> GetAllAsync(PersistedGrantFilter filter) { - return Collection.ReplaceOneAsync(x => x.Key == grant.Key, grant, UpsertReplace); + return await Collection.Find(CreateFilter(filter)).ToListAsync(); } public Task GetAsync(string key) @@ -62,19 +63,51 @@ namespace Squidex.Domain.Users.MongoDb.Infrastructure return Collection.Find(x => x.Key == key).FirstOrDefaultAsync(); } - public Task RemoveAllAsync(string subjectId, string clientId, string type) + public Task RemoveAllAsync(PersistedGrantFilter filter) { - return Collection.DeleteManyAsync(x => x.SubjectId == subjectId && x.ClientId == clientId && x.Type == type); + return Collection.DeleteManyAsync(CreateFilter(filter)); } - public Task RemoveAllAsync(string subjectId, string clientId) + public Task RemoveAsync(string key) { - return Collection.DeleteManyAsync(x => x.SubjectId == subjectId && x.ClientId == clientId); + return Collection.DeleteManyAsync(x => x.Key == key); } - public Task RemoveAsync(string key) + public Task StoreAsync(PersistedGrant grant) { - return Collection.DeleteManyAsync(x => x.Key == key); + return Collection.ReplaceOneAsync(x => x.Key == grant.Key, grant, UpsertReplace); + } + + private static FilterDefinition CreateFilter(PersistedGrantFilter filter) + { + var filters = new List>(); + + if (!string.IsNullOrWhiteSpace(filter.ClientId)) + { + filters.Add(Filter.Eq(x => x.ClientId, filter.ClientId)); + } + + if (!string.IsNullOrWhiteSpace(filter.SessionId)) + { + filters.Add(Filter.Eq(x => x.SessionId, filter.SessionId)); + } + + if (!string.IsNullOrWhiteSpace(filter.SubjectId)) + { + filters.Add(Filter.Eq(x => x.SubjectId, filter.SubjectId)); + } + + if (!string.IsNullOrWhiteSpace(filter.Type)) + { + filters.Add(Filter.Eq(x => x.Type, filter.Type)); + } + + if (filters.Count > 0) + { + return Filter.And(filters); + } + + return new BsonDocument(); } } } diff --git a/backend/src/Squidex.Domain.Users.MongoDb/Squidex.Domain.Users.MongoDb.csproj b/backend/src/Squidex.Domain.Users.MongoDb/Squidex.Domain.Users.MongoDb.csproj index cf77ef86c..a003a467e 100644 --- a/backend/src/Squidex.Domain.Users.MongoDb/Squidex.Domain.Users.MongoDb.csproj +++ b/backend/src/Squidex.Domain.Users.MongoDb/Squidex.Domain.Users.MongoDb.csproj @@ -18,9 +18,9 @@ - + - + diff --git a/backend/src/Squidex.Domain.Users/Squidex.Domain.Users.csproj b/backend/src/Squidex.Domain.Users/Squidex.Domain.Users.csproj index 58056e58d..05367afb2 100644 --- a/backend/src/Squidex.Domain.Users/Squidex.Domain.Users.csproj +++ b/backend/src/Squidex.Domain.Users/Squidex.Domain.Users.csproj @@ -16,7 +16,7 @@ - + diff --git a/backend/src/Squidex.Infrastructure.Amazon/Squidex.Infrastructure.Amazon.csproj b/backend/src/Squidex.Infrastructure.Amazon/Squidex.Infrastructure.Amazon.csproj index 01c22cc6c..cccb4d123 100644 --- a/backend/src/Squidex.Infrastructure.Amazon/Squidex.Infrastructure.Amazon.csproj +++ b/backend/src/Squidex.Infrastructure.Amazon/Squidex.Infrastructure.Amazon.csproj @@ -6,7 +6,7 @@ enable - + diff --git a/backend/src/Squidex.Infrastructure.Azure/Squidex.Infrastructure.Azure.csproj b/backend/src/Squidex.Infrastructure.Azure/Squidex.Infrastructure.Azure.csproj index d307693ad..bd1a4b57e 100644 --- a/backend/src/Squidex.Infrastructure.Azure/Squidex.Infrastructure.Azure.csproj +++ b/backend/src/Squidex.Infrastructure.Azure/Squidex.Infrastructure.Azure.csproj @@ -6,11 +6,11 @@ enable - - + + - + diff --git a/backend/src/Squidex.Infrastructure.GetEventStore/Squidex.Infrastructure.GetEventStore.csproj b/backend/src/Squidex.Infrastructure.GetEventStore/Squidex.Infrastructure.GetEventStore.csproj index 3de2c7e28..966d97a88 100644 --- a/backend/src/Squidex.Infrastructure.GetEventStore/Squidex.Infrastructure.GetEventStore.csproj +++ b/backend/src/Squidex.Infrastructure.GetEventStore/Squidex.Infrastructure.GetEventStore.csproj @@ -10,7 +10,7 @@ True - + diff --git a/backend/src/Squidex.Infrastructure.GoogleCloud/Squidex.Infrastructure.GoogleCloud.csproj b/backend/src/Squidex.Infrastructure.GoogleCloud/Squidex.Infrastructure.GoogleCloud.csproj index 2ad2ac049..e3c47f7d8 100644 --- a/backend/src/Squidex.Infrastructure.GoogleCloud/Squidex.Infrastructure.GoogleCloud.csproj +++ b/backend/src/Squidex.Infrastructure.GoogleCloud/Squidex.Infrastructure.GoogleCloud.csproj @@ -10,7 +10,7 @@ True - + diff --git a/backend/src/Squidex.Infrastructure.MongoDb/Squidex.Infrastructure.MongoDb.csproj b/backend/src/Squidex.Infrastructure.MongoDb/Squidex.Infrastructure.MongoDb.csproj index 898575b26..158864e4b 100644 --- a/backend/src/Squidex.Infrastructure.MongoDb/Squidex.Infrastructure.MongoDb.csproj +++ b/backend/src/Squidex.Infrastructure.MongoDb/Squidex.Infrastructure.MongoDb.csproj @@ -13,8 +13,8 @@ - - + + diff --git a/backend/src/Squidex.Infrastructure.RabbitMq/Squidex.Infrastructure.RabbitMq.csproj b/backend/src/Squidex.Infrastructure.RabbitMq/Squidex.Infrastructure.RabbitMq.csproj index c28abe580..b58f6ebc1 100644 --- a/backend/src/Squidex.Infrastructure.RabbitMq/Squidex.Infrastructure.RabbitMq.csproj +++ b/backend/src/Squidex.Infrastructure.RabbitMq/Squidex.Infrastructure.RabbitMq.csproj @@ -10,7 +10,7 @@ True - + diff --git a/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj b/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj index 94eb9a6bc..1975ca219 100644 --- a/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj +++ b/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj @@ -15,28 +15,28 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - + + + + + + + all runtime; build; native; contentfiles; analyzers - - + + - + - + diff --git a/backend/src/Squidex.Web/Squidex.Web.csproj b/backend/src/Squidex.Web/Squidex.Web.csproj index bf76eab04..3ab607cf2 100644 --- a/backend/src/Squidex.Web/Squidex.Web.csproj +++ b/backend/src/Squidex.Web/Squidex.Web.csproj @@ -12,7 +12,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/backend/src/Squidex/Areas/IdentityServer/Config/LazyClientStore.cs b/backend/src/Squidex/Areas/IdentityServer/Config/LazyClientStore.cs index ce23bffe7..ba177a4b4 100644 --- a/backend/src/Squidex/Areas/IdentityServer/Config/LazyClientStore.cs +++ b/backend/src/Squidex/Areas/IdentityServer/Config/LazyClientStore.cs @@ -109,9 +109,9 @@ namespace Squidex.Areas.IdentityServer.Config Constants.RoleScope, Constants.PermissionsScope }, - Claims = new List + Claims = new List { - new Claim(OpenIdClaims.Subject, user.Id) + new ClientClaim(OpenIdClaims.Subject, user.Id) } }; } @@ -228,9 +228,9 @@ namespace Squidex.Areas.IdentityServer.Config Constants.RoleScope, Constants.PermissionsScope }, - Claims = new List + Claims = new List { - new Claim(SquidexClaimTypes.Permissions, Permissions.All) + new ClientClaim(SquidexClaimTypes.Permissions, Permissions.All) } }; } diff --git a/backend/src/Squidex/Squidex.csproj b/backend/src/Squidex/Squidex.csproj index a3e297f9b..4610393aa 100644 --- a/backend/src/Squidex/Squidex.csproj +++ b/backend/src/Squidex/Squidex.csproj @@ -34,32 +34,32 @@ - + - + - - - - - + + + + + - - - - - - + + + + + + - - + + - - + + diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj b/backend/tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj index c3dd4894b..5398e1d21 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj @@ -12,16 +12,16 @@ - + - - - + + + - + all runtime; build; native; contentfiles; analyzers diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Squidex.Domain.Apps.Entities.Tests.csproj b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Squidex.Domain.Apps.Entities.Tests.csproj index 522befece..1eb997e60 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Squidex.Domain.Apps.Entities.Tests.csproj +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Squidex.Domain.Apps.Entities.Tests.csproj @@ -17,18 +17,18 @@ - + - - + + - + all runtime; build; native; contentfiles; analyzers diff --git a/backend/tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj b/backend/tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj index 759c3072f..7cb2c123f 100644 --- a/backend/tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj +++ b/backend/tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj @@ -13,14 +13,14 @@ - + - + - + all runtime; build; native; contentfiles; analyzers diff --git a/backend/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj b/backend/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj index b81681a8d..0a5e2ef1b 100644 --- a/backend/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj +++ b/backend/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj @@ -20,13 +20,13 @@ - + - - - - - + + + + + all runtime; build; native; contentfiles; analyzers @@ -34,7 +34,7 @@ - + all runtime; build; native; contentfiles; analyzers diff --git a/backend/tests/Squidex.Web.Tests/Squidex.Web.Tests.csproj b/backend/tests/Squidex.Web.Tests/Squidex.Web.Tests.csproj index 411147f27..b0ad2ac0e 100644 --- a/backend/tests/Squidex.Web.Tests/Squidex.Web.Tests.csproj +++ b/backend/tests/Squidex.Web.Tests/Squidex.Web.Tests.csproj @@ -11,14 +11,14 @@ - - - - + + + + - + all runtime; build; native; contentfiles; analyzers From 932f0893ad4f4f9eedefee5de5d60aa06c3746f2 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 8 Sep 2020 12:32:25 +0200 Subject: [PATCH 03/21] Identity server fix. --- .../Areas/IdentityServer/Config/IdentityServerServices.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/backend/src/Squidex/Areas/IdentityServer/Config/IdentityServerServices.cs b/backend/src/Squidex/Areas/IdentityServer/Config/IdentityServerServices.cs index 9646cf9fd..ebf794da3 100644 --- a/backend/src/Squidex/Areas/IdentityServer/Config/IdentityServerServices.cs +++ b/backend/src/Squidex/Areas/IdentityServer/Config/IdentityServerServices.cs @@ -63,10 +63,16 @@ namespace Squidex.Areas.IdentityServer.Config options.UserInteraction.ErrorUrl = "/error/"; }) .AddAspNetIdentity() + .AddInMemoryApiScopes(GetApiScopes()) .AddInMemoryApiResources(GetApiResources()) .AddInMemoryIdentityResources(GetIdentityResources()); } + private static IEnumerable GetApiScopes() + { + yield return new ApiScope(Constants.ApiScope); + } + private static IEnumerable GetApiResources() { yield return new ApiResource(Constants.ApiScope) From 26a50c1199c2b579488873060445b3cd828cf83c Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 8 Sep 2020 12:37:03 +0200 Subject: [PATCH 04/21] Removed unsued code. --- .../Contents/GraphQL/GraphQLModel.cs | 22 +++---------------- .../Contents/GraphQL/IGraphModel.cs | 4 ++-- .../IdentityServer/Config/LazyClientStore.cs | 1 - 3 files changed, 5 insertions(+), 22 deletions(-) diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs index 96ba556df..f9272bcd4 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs @@ -10,7 +10,6 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using GraphQL; -using GraphQL.Resolvers; using GraphQL.Types; using Squidex.Domain.Apps.Core; using Squidex.Domain.Apps.Core.Schemas; @@ -29,8 +28,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL { private readonly Dictionary contentTypes = new Dictionary(); private readonly PartitionResolver partitionResolver; - private readonly IAppEntity app; - private readonly IObjectGraphType assetType; + private readonly IGraphType assetType; private readonly IGraphType assetListType; private readonly GraphQLSchema graphQLSchema; @@ -42,8 +40,6 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL int pageSizeAssets, IUrlGenerator urlGenerator) { - this.app = app; - partitionResolver = app.PartitionResolver(); CanGenerateAssetSourceUrl = urlGenerator.CanGenerateAssetSourceUrl; @@ -100,18 +96,6 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL return schema; } - public IFieldResolver ResolveContentUrl(ISchemaEntity schema) - { - var resolver = new FuncFieldResolver(c => - { - var context = (GraphQLExecutionContext)c.UserContext; - - return context.UrlGenerator.ContentUI(app.NamedId(), schema.NamedId(), c.Source.Id); - }); - - return resolver; - } - public IFieldPartitioning ResolvePartition(Partitioning key) { return partitionResolver(key); @@ -127,12 +111,12 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL return field.Accept(new QueryGraphTypeVisitor(schema, contentTypes, this, assetListType, fieldName)); } - public IObjectGraphType GetAssetType() + public IGraphType GetAssetType() { return assetType; } - public IObjectGraphType GetContentType(Guid schemaId) + public IGraphType GetContentType(Guid schemaId) { return contentTypes.GetOrDefault(schemaId); } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/IGraphModel.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/IGraphModel.cs index e0e099331..1fef0c632 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/IGraphModel.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/IGraphModel.cs @@ -20,9 +20,9 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL IFieldPartitioning ResolvePartition(Partitioning key); - IObjectGraphType GetAssetType(); + IGraphType GetAssetType(); - IObjectGraphType GetContentType(Guid schemaId); + IGraphType GetContentType(Guid schemaId); IGraphType? GetInputGraphType(ISchemaEntity schema, IField field, string fieldName); diff --git a/backend/src/Squidex/Areas/IdentityServer/Config/LazyClientStore.cs b/backend/src/Squidex/Areas/IdentityServer/Config/LazyClientStore.cs index ba177a4b4..e4ce295b5 100644 --- a/backend/src/Squidex/Areas/IdentityServer/Config/LazyClientStore.cs +++ b/backend/src/Squidex/Areas/IdentityServer/Config/LazyClientStore.cs @@ -7,7 +7,6 @@ using System; using System.Collections.Generic; -using System.Security.Claims; using System.Threading.Tasks; using IdentityServer4; using IdentityServer4.Models; From f9169889c43f5385a07f3ca28fc58b2b32dd4068 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 8 Sep 2020 13:17:50 +0200 Subject: [PATCH 05/21] Shared executor. --- .../Contents/GraphQL/GraphQLModel.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs index f9272bcd4..7bcd837bc 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs @@ -26,6 +26,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL { public sealed class GraphQLModel : IGraphModel { + private static readonly IDocumentExecuter Executor = new DocumentExecuter(); private readonly Dictionary contentTypes = new Dictionary(); private readonly PartitionResolver partitionResolver; private readonly IGraphType assetType; @@ -125,7 +126,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL { Guard.NotNull(context, nameof(context)); - var result = await new DocumentExecuter().ExecuteAsync(execution => + var result = await Executor.ExecuteAsync(execution => { context.Setup(execution); @@ -134,7 +135,9 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL execution.Query = query.Query; }).ConfigureAwait(false); - return (result.Data, result.Errors?.Select(x => (object)new { x.Message, x.Locations }).ToArray()); + var errors = result.Errors?.Select(x => (object)new { x.Message, x.Locations }).ToArray(); + + return (result.Data, errors); } } } From 02f7e283f0c9e65a4f204a22d0a6db78b9d33707 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 8 Sep 2020 15:18:36 +0200 Subject: [PATCH 06/21] Claims fixes. --- .../IdentityServer/Config/IdentityServerServices.cs | 11 +---------- .../app/shared/components/table-header.component.html | 2 +- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/backend/src/Squidex/Areas/IdentityServer/Config/IdentityServerServices.cs b/backend/src/Squidex/Areas/IdentityServer/Config/IdentityServerServices.cs index ebf794da3..506484244 100644 --- a/backend/src/Squidex/Areas/IdentityServer/Config/IdentityServerServices.cs +++ b/backend/src/Squidex/Areas/IdentityServer/Config/IdentityServerServices.cs @@ -37,9 +37,6 @@ namespace Squidex.Areas.IdentityServer.Config services.AddDataProtection().SetApplicationName("Squidex"); - services.AddSingleton(GetApiResources()); - services.AddSingleton(GetIdentityResources()); - services.AddIdentity() .AddDefaultTokenProviders(); @@ -64,18 +61,12 @@ namespace Squidex.Areas.IdentityServer.Config }) .AddAspNetIdentity() .AddInMemoryApiScopes(GetApiScopes()) - .AddInMemoryApiResources(GetApiResources()) .AddInMemoryIdentityResources(GetIdentityResources()); } private static IEnumerable GetApiScopes() { - yield return new ApiScope(Constants.ApiScope); - } - - private static IEnumerable GetApiResources() - { - yield return new ApiResource(Constants.ApiScope) + yield return new ApiScope(Constants.ApiScope) { UserClaims = new List { diff --git a/frontend/app/shared/components/table-header.component.html b/frontend/app/shared/components/table-header.component.html index 175ccbfd0..46e69b481 100644 --- a/frontend/app/shared/components/table-header.component.html +++ b/frontend/app/shared/components/table-header.component.html @@ -3,7 +3,7 @@ - {{text}} + {{text | sqxTranslate}} From b8f7cb07180680ceb0730fee1499fe7cfb7f5650 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Wed, 9 Sep 2020 11:19:55 +0200 Subject: [PATCH 07/21] Count events. --- backend/i18n/frontend_en.json | 1 + backend/i18n/frontend_it.json | 1 + backend/i18n/frontend_nl.json | 1 + backend/i18n/source/frontend_en.json | 1 + .../EventSourcing/EventConsumerInfo.cs | 2 ++ .../EventSourcing/Grains/EventConsumerState.cs | 12 ++++++++---- .../EventConsumers/Models/EventConsumerDto.cs | 2 ++ backend/src/Squidex/Config/Domain/StoreServices.cs | 3 --- .../event-consumers/event-consumer.component.html | 3 +++ .../event-consumers-page.component.html | 3 +++ .../services/event-consumers.service.spec.ts | 2 ++ .../services/event-consumers.service.ts | 2 ++ frontend/app/theme/_panels.scss | 7 +++++++ 13 files changed, 33 insertions(+), 7 deletions(-) diff --git a/backend/i18n/frontend_en.json b/backend/i18n/frontend_en.json index e4c1487ea..cc3761743 100644 --- a/backend/i18n/frontend_en.json +++ b/backend/i18n/frontend_en.json @@ -481,6 +481,7 @@ "dashboard.trafficSummaryCard": "API Traffic Summary", "dashboard.welcomeText": "Welcome to **{app}** dashboard.", "dashboard.welcomeTitle": "Hi {user}", + "eventConsumers.count": "Count", "eventConsumers.loadFailed": "Failed to load event consumers. Please reload.", "eventConsumers.pageTitle": "Event Consumers", "eventConsumers.position": "Position", diff --git a/backend/i18n/frontend_it.json b/backend/i18n/frontend_it.json index 78a52c4f3..606dd164a 100644 --- a/backend/i18n/frontend_it.json +++ b/backend/i18n/frontend_it.json @@ -481,6 +481,7 @@ "dashboard.trafficSummaryCard": "Riepilogo del traffico delle API", "dashboard.welcomeText": "Benvenuto su **{app}** dashboard.", "dashboard.welcomeTitle": "Ciao {user}", + "eventConsumers.count": "Count", "eventConsumers.loadFailed": "Non è stato possibile caricare event consumers. Per favore ricarica.", "eventConsumers.pageTitle": "Eventi degli utenti", "eventConsumers.position": "Posizione", diff --git a/backend/i18n/frontend_nl.json b/backend/i18n/frontend_nl.json index 2557e7323..34a0ddfa3 100644 --- a/backend/i18n/frontend_nl.json +++ b/backend/i18n/frontend_nl.json @@ -481,6 +481,7 @@ "dashboard.trafficSummaryCard": "API Verkeer Samenvatting", "dashboard.welcomeText": "Welkom bij **{app}** dashboard.", "dashboard.welcomeTitle": "Hallo {user}", + "eventConsumers.count": "Count", "eventConsumers.loadFailed": "Kan gebeurtenisgebruikers niet laden. Laad opnieuw.", "eventConsumers.pageTitle": "Evenementconsumenten", "eventConsumers.position": "Positie", diff --git a/backend/i18n/source/frontend_en.json b/backend/i18n/source/frontend_en.json index e4c1487ea..cc3761743 100644 --- a/backend/i18n/source/frontend_en.json +++ b/backend/i18n/source/frontend_en.json @@ -481,6 +481,7 @@ "dashboard.trafficSummaryCard": "API Traffic Summary", "dashboard.welcomeText": "Welcome to **{app}** dashboard.", "dashboard.welcomeTitle": "Hi {user}", + "eventConsumers.count": "Count", "eventConsumers.loadFailed": "Failed to load event consumers. Please reload.", "eventConsumers.pageTitle": "Event Consumers", "eventConsumers.position": "Position", diff --git a/backend/src/Squidex.Infrastructure/EventSourcing/EventConsumerInfo.cs b/backend/src/Squidex.Infrastructure/EventSourcing/EventConsumerInfo.cs index d17f8e069..44562ada5 100644 --- a/backend/src/Squidex.Infrastructure/EventSourcing/EventConsumerInfo.cs +++ b/backend/src/Squidex.Infrastructure/EventSourcing/EventConsumerInfo.cs @@ -11,6 +11,8 @@ namespace Squidex.Infrastructure.EventSourcing { public bool IsStopped { get; set; } + public int Count { get; set; } + public string Name { get; set; } public string Error { get; set; } diff --git a/backend/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerState.cs b/backend/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerState.cs index 5fabc4c86..f772a0a3b 100644 --- a/backend/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerState.cs +++ b/backend/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerState.cs @@ -14,6 +14,8 @@ namespace Squidex.Infrastructure.EventSourcing.Grains { public bool IsStopped { get; set; } + public int Count { get; set; } + public string? Error { get; set; } public string? Position { get; set; } @@ -32,9 +34,11 @@ namespace Squidex.Infrastructure.EventSourcing.Grains { } - public EventConsumerState(string? position) + public EventConsumerState(string? position, int count) { Position = position; + + Count = count; } public EventConsumerState Reset() @@ -44,17 +48,17 @@ namespace Squidex.Infrastructure.EventSourcing.Grains public EventConsumerState Handled(string position) { - return new EventConsumerState(position); + return new EventConsumerState(position, Count + 1); } public EventConsumerState Stopped(Exception? ex = null) { - return new EventConsumerState(Position) { IsStopped = true, Error = ex?.ToString() }; + return new EventConsumerState(Position, Count) { IsStopped = true, Error = ex?.ToString() }; } public EventConsumerState Started() { - return new EventConsumerState(Position) { IsStopped = false }; + return new EventConsumerState(Position, Count) { IsStopped = false }; } public EventConsumerInfo ToInfo(string name) diff --git a/backend/src/Squidex/Areas/Api/Controllers/EventConsumers/Models/EventConsumerDto.cs b/backend/src/Squidex/Areas/Api/Controllers/EventConsumers/Models/EventConsumerDto.cs index e1ac74e3f..137fbeae7 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/EventConsumers/Models/EventConsumerDto.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/EventConsumers/Models/EventConsumerDto.cs @@ -17,6 +17,8 @@ namespace Squidex.Areas.Api.Controllers.EventConsumers.Models public bool IsResetting { get; set; } + public int Count { get; set; } + public string Name { get; set; } public string? Error { get; set; } diff --git a/backend/src/Squidex/Config/Domain/StoreServices.cs b/backend/src/Squidex/Config/Domain/StoreServices.cs index 0b4e7b9dd..ff70fdbab 100644 --- a/backend/src/Squidex/Config/Domain/StoreServices.cs +++ b/backend/src/Squidex/Config/Domain/StoreServices.cs @@ -119,9 +119,6 @@ namespace Squidex.Config.Domain .As().As>(); services.AddSingletonAs() - .AsSelf(); - - services.AddSingletonAs(c => new CachingTextIndexerState(c.GetRequiredService())) .As(); var registration = services.FirstOrDefault(x => x.ServiceType == typeof(IPersistedGrantStore)); diff --git a/frontend/app/features/administration/pages/event-consumers/event-consumer.component.html b/frontend/app/features/administration/pages/event-consumers/event-consumer.component.html index 2e41dfcb4..726225fc7 100644 --- a/frontend/app/features/administration/pages/event-consumers/event-consumer.component.html +++ b/frontend/app/features/administration/pages/event-consumers/event-consumer.component.html @@ -6,6 +6,9 @@ {{eventConsumer.name}} + + {{eventConsumer.count}} + {{eventConsumer.position}} diff --git a/frontend/app/features/administration/pages/event-consumers/event-consumers-page.component.html b/frontend/app/features/administration/pages/event-consumers/event-consumers-page.component.html index a7468a5fe..e1fc0bb36 100644 --- a/frontend/app/features/administration/pages/event-consumers/event-consumers-page.component.html +++ b/frontend/app/features/administration/pages/event-consumers/event-consumers-page.component.html @@ -22,6 +22,9 @@ {{ 'common.name' | sqxTranslate }} + + {{ 'eventConsumers.count' | sqxTranslate }} + {{ 'eventConsumers.position' | sqxTranslate }} diff --git a/frontend/app/features/administration/services/event-consumers.service.spec.ts b/frontend/app/features/administration/services/event-consumers.service.spec.ts index 54dcc6260..3d7e2ec78 100644 --- a/frontend/app/features/administration/services/event-consumers.service.spec.ts +++ b/frontend/app/features/administration/services/event-consumers.service.spec.ts @@ -134,6 +134,7 @@ describe('EventConsumersService', () => { return { name: `event-consumer${id}`, position: `position${id}`, + count: id, isStopped: true, isResetting: true, error: `failure${id}`, @@ -151,6 +152,7 @@ export function createEventConsumer(id: number, suffix = '') { return new EventConsumerDto(links, `event-consumer${id}`, + id, true, true, `failure${id}${suffix}`, diff --git a/frontend/app/features/administration/services/event-consumers.service.ts b/frontend/app/features/administration/services/event-consumers.service.ts index 3fe40dae1..dd3996378 100644 --- a/frontend/app/features/administration/services/event-consumers.service.ts +++ b/frontend/app/features/administration/services/event-consumers.service.ts @@ -30,6 +30,7 @@ export class EventConsumerDto { constructor(links: ResourceLinks, public readonly name: string, + public readonly count: number, public readonly isStopped?: boolean, public readonly isResetting?: boolean, public readonly error?: string, @@ -104,6 +105,7 @@ function parseEventConsumer(response: any): EventConsumerDto { return new EventConsumerDto( response._links, response.name, + response.count, response.isStopped, response.isResetting, response.error, diff --git a/frontend/app/theme/_panels.scss b/frontend/app/theme/_panels.scss index 4687ac763..78b7ed93f 100644 --- a/frontend/app/theme/_panels.scss +++ b/frontend/app/theme/_panels.scss @@ -334,11 +334,14 @@ &-item { & { @include border-radius; + color: inherit; display: block; font-size: .9rem; font-weight: normal; margin-bottom: .25rem; padding: .25rem 1rem; + text-align: left; + text-decoration: none; } &-remove { @@ -352,6 +355,9 @@ &.active, &:hover { background: $color-theme-secondary; + color: inherit; + text-align: left; + text-decoration: none; } &.inactive { @@ -359,6 +365,7 @@ } &:hover { + .sidebar-item-remove { visibility: visible; } From d4bcc495c88c91d4cdd3f2f34756144ad70bdeea Mon Sep 17 00:00:00 2001 From: Sebastian Date: Wed, 9 Sep 2020 17:10:46 +0200 Subject: [PATCH 08/21] Semaphore for image resizing. --- .../ImageSharpAssetThumbnailGenerator.cs | 124 +++++++++++------- 1 file changed, 75 insertions(+), 49 deletions(-) diff --git a/backend/src/Squidex.Infrastructure/Assets/ImageSharp/ImageSharpAssetThumbnailGenerator.cs b/backend/src/Squidex.Infrastructure/Assets/ImageSharp/ImageSharpAssetThumbnailGenerator.cs index 2c44d9340..cfcb8e9ca 100644 --- a/backend/src/Squidex.Infrastructure/Assets/ImageSharp/ImageSharpAssetThumbnailGenerator.cs +++ b/backend/src/Squidex.Infrastructure/Assets/ImageSharp/ImageSharpAssetThumbnailGenerator.cs @@ -7,6 +7,7 @@ using System; using System.IO; +using System.Threading; using System.Threading.Tasks; using SixLabors.ImageSharp; using SixLabors.ImageSharp.Formats.Jpeg; @@ -19,76 +20,89 @@ namespace Squidex.Infrastructure.Assets.ImageSharp { public sealed class ImageSharpAssetThumbnailGenerator : IAssetThumbnailGenerator { - public Task CreateThumbnailAsync(Stream source, Stream destination, ResizeOptions options) + private readonly SemaphoreSlim semaphoreSlim = new SemaphoreSlim(Math.Max(Environment.ProcessorCount / 4, 1)); + + public async Task CreateThumbnailAsync(Stream source, Stream destination, ResizeOptions options) { + Guard.NotNull(source, nameof(source)); + Guard.NotNull(destination, nameof(destination)); Guard.NotNull(options, nameof(options)); if (!options.IsValid) { source.CopyTo(destination); - return Task.CompletedTask; + return; } var w = options.Width ?? 0; var h = options.Height ?? 0; - using (var image = Image.Load(source, out var format)) - { - var encoder = Configuration.Default.ImageFormatsManager.FindEncoder(format); - - if (encoder == null) - { - throw new NotSupportedException(); - } - - if (options.Quality.HasValue && (encoder is JpegEncoder || !options.KeepFormat)) - { - encoder = new JpegEncoder { Quality = options.Quality.Value }; - } + await semaphoreSlim.WaitAsync(); - image.Mutate(x => x.AutoOrient()); - - if (w > 0 || h > 0) + try + { + using (var image = Image.Load(source, out var format)) { - var isCropUpsize = options.Mode == ResizeMode.CropUpsize; + var encoder = Configuration.Default.ImageFormatsManager.FindEncoder(format); - if (!Enum.TryParse(options.Mode.ToString(), true, out var resizeMode)) + if (encoder == null) { - resizeMode = ISResizeMode.Max; + throw new NotSupportedException(); } - if (isCropUpsize) + if (options.Quality.HasValue && (encoder is JpegEncoder || !options.KeepFormat)) { - resizeMode = ISResizeMode.Crop; + encoder = new JpegEncoder { Quality = options.Quality.Value }; } - if (w >= image.Width && h >= image.Height && resizeMode == ISResizeMode.Crop && !isCropUpsize) - { - resizeMode = ISResizeMode.BoxPad; - } - - var resizeOptions = new ISResizeOptions { Size = new Size(w, h), Mode = resizeMode }; + image.Mutate(x => x.AutoOrient()); - if (options.FocusX.HasValue && options.FocusY.HasValue) + if (w > 0 || h > 0) { - resizeOptions.CenterCoordinates = new PointF( - +(options.FocusX.Value / 2f) + 0.5f, - -(options.FocusY.Value / 2f) + 0.5f - ); + var isCropUpsize = options.Mode == ResizeMode.CropUpsize; + + if (!Enum.TryParse(options.Mode.ToString(), true, out var resizeMode)) + { + resizeMode = ISResizeMode.Max; + } + + if (isCropUpsize) + { + resizeMode = ISResizeMode.Crop; + } + + if (w >= image.Width && h >= image.Height && resizeMode == ISResizeMode.Crop && !isCropUpsize) + { + resizeMode = ISResizeMode.BoxPad; + } + + var resizeOptions = new ISResizeOptions { Size = new Size(w, h), Mode = resizeMode }; + + if (options.FocusX.HasValue && options.FocusY.HasValue) + { + resizeOptions.CenterCoordinates = new PointF( + +(options.FocusX.Value / 2f) + 0.5f, + -(options.FocusY.Value / 2f) + 0.5f + ); + } + + image.Mutate(x => x.Resize(resizeOptions)); } - image.Mutate(x => x.Resize(resizeOptions)); + image.Save(destination, encoder); } - - image.Save(destination, encoder); } - - return Task.CompletedTask; + finally + { + semaphoreSlim.Release(); + } } public Task GetImageInfoAsync(Stream source) { + Guard.NotNull(source, nameof(source)); + ImageInfo? result = null; try @@ -108,22 +122,34 @@ namespace Squidex.Infrastructure.Assets.ImageSharp return Task.FromResult(result); } - public Task FixOrientationAsync(Stream source, Stream destination) + public async Task FixOrientationAsync(Stream source, Stream destination) { - using (var image = Image.Load(source, out var format)) - { - var encoder = Configuration.Default.ImageFormatsManager.FindEncoder(format); + Guard.NotNull(source, nameof(source)); + Guard.NotNull(destination, nameof(destination)); + + await semaphoreSlim.WaitAsync(); - if (encoder == null) + try + { + using (var image = Image.Load(source, out var format)) { - throw new NotSupportedException(); - } + var encoder = Configuration.Default.ImageFormatsManager.FindEncoder(format); + + if (encoder == null) + { + throw new NotSupportedException(); + } - image.Mutate(x => x.AutoOrient()); + image.Mutate(x => x.AutoOrient()); - image.Save(destination, encoder); + image.Save(destination, encoder); - return Task.FromResult(GetImageInfo(image)); + return GetImageInfo(image); + } + } + finally + { + semaphoreSlim.Release(); } } From 18785fea1637aeab03c7cf79927a1409f3bed680 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Wed, 9 Sep 2020 17:32:52 +0200 Subject: [PATCH 09/21] Tests fixed --- .../EventSourcing/Grains/EventConsumerGrainTests.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/tests/Squidex.Infrastructure.Tests/EventSourcing/Grains/EventConsumerGrainTests.cs b/backend/tests/Squidex.Infrastructure.Tests/EventSourcing/Grains/EventConsumerGrainTests.cs index f98d78869..c9fd499b2 100644 --- a/backend/tests/Squidex.Infrastructure.Tests/EventSourcing/Grains/EventConsumerGrainTests.cs +++ b/backend/tests/Squidex.Infrastructure.Tests/EventSourcing/Grains/EventConsumerGrainTests.cs @@ -186,7 +186,7 @@ namespace Squidex.Infrastructure.EventSourcing.Grains await OnEventAsync(eventSubscription, @event); - AssetGrainState(new EventConsumerState { IsStopped = false, Position = @event.EventPosition, Error = null }); + AssetGrainState(new EventConsumerState { IsStopped = false, Position = @event.EventPosition, Error = null, Count = 1 }); A.CallTo(() => grainState.WriteAsync()) .MustHaveHappened(1, Times.Exactly); @@ -208,7 +208,7 @@ namespace Squidex.Infrastructure.EventSourcing.Grains await OnEventAsync(eventSubscription, @event); - AssetGrainState(new EventConsumerState { IsStopped = false, Position = @event.EventPosition, Error = null }); + AssetGrainState(new EventConsumerState { IsStopped = false, Position = @event.EventPosition, Error = null, Count = 1 }); A.CallTo(() => grainState.WriteAsync()) .MustHaveHappened(1, Times.Exactly); @@ -230,7 +230,7 @@ namespace Squidex.Infrastructure.EventSourcing.Grains await OnEventAsync(eventSubscription, @event); - AssetGrainState(new EventConsumerState { IsStopped = false, Position = @event.EventPosition, Error = null }); + AssetGrainState(new EventConsumerState { IsStopped = false, Position = @event.EventPosition, Error = null, Count = 1 }); A.CallTo(() => grainState.WriteAsync()) .MustHaveHappened(1, Times.Exactly); From 740a7c229464f7fe17c9fe2209731f148067e9a7 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Tue, 15 Sep 2020 16:48:30 +0200 Subject: [PATCH 10/21] Fixes/fixes (#576) Several bugfixes --- .../Templates/CreateBlogCommandMiddleware.cs | 2 - .../content/content-history-page.component.ts | 6 +- .../angular/forms/control-errors.component.ts | 36 +- .../editors/date-time-editor.component.html | 2 +- .../editors/date-time-editor.component.ts | 10 + .../angular/forms/error-formatting.spec.ts | 191 ++ .../angular/forms/error-formatting.ts | 47 + .../services/localizer.service.spec.ts | 9 + .../framework/services/localizer.service.ts | 73 +- .../app/shared/state/contents.forms.spec.ts | 8 +- .../shared/state/contents.forms.visitors.ts | 2 +- frontend/package-lock.json | 1640 +++++------------ frontend/package.json | 82 +- frontend/tsconfig.spec.json | 3 + 14 files changed, 868 insertions(+), 1243 deletions(-) create mode 100644 frontend/app/framework/angular/forms/error-formatting.spec.ts create mode 100644 frontend/app/framework/angular/forms/error-formatting.ts diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateBlogCommandMiddleware.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateBlogCommandMiddleware.cs index 94967d103..e975887da 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateBlogCommandMiddleware.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateBlogCommandMiddleware.cs @@ -98,7 +98,6 @@ namespace Squidex.Domain.Apps.Entities.Apps.Templates .Hints("The title of the post.")) .AddString("Text", f => f .AsRichText() - .Length(100) .Required() .Hints("The text of the post.")) .AddString("Slug", f => f @@ -124,7 +123,6 @@ namespace Squidex.Domain.Apps.Entities.Apps.Templates .Hints("The title of the page.")) .AddString("Text", f => f .AsRichText() - .Length(100) .Required() .Hints("The text of the page.")) .AddString("Slug", f => f diff --git a/frontend/app/features/content/pages/content/content-history-page.component.ts b/frontend/app/features/content/pages/content/content-history-page.component.ts index 8f9a97e64..d9a1418de 100644 --- a/frontend/app/features/content/pages/content/content-history-page.component.ts +++ b/frontend/app/features/content/pages/content/content-history-page.component.ts @@ -79,7 +79,11 @@ export class ContentHistoryPageComponent extends ResourceOwner implements OnInit } public createDraft() { - this.contentsState.createDraft(this.content); + this.contentPage.checkPendingChangesBeforeChangingStatus().pipe( + filter(x => !!x), + switchMap(d => this.contentsState.createDraft(this.content)), + onErrorResumeNext()) + .subscribe(); } public delete() { diff --git a/frontend/app/framework/angular/forms/control-errors.component.ts b/frontend/app/framework/angular/forms/control-errors.component.ts index 5d12ce263..2ceaedcca 100644 --- a/frontend/app/framework/angular/forms/control-errors.component.ts +++ b/frontend/app/framework/angular/forms/control-errors.component.ts @@ -9,6 +9,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Host, Input, OnC import { AbstractControl, FormArray, FormGroupDirective } from '@angular/forms'; import { fadeAnimation, LocalizerService, StatefulComponent, Types } from '@app/framework/internal'; import { merge } from 'rxjs'; +import { formatError } from './error-formatting'; interface State { // The error messages to show. @@ -121,40 +122,7 @@ export class ControlErrorsComponent extends StatefulComponent implements if (this.control && this.control.invalid && this.isTouched && this.control.errors) { for (const key in this.control.errors) { if (this.control.errors.hasOwnProperty(key)) { - let type = key.toLowerCase(); - - if (Types.isString(this.control.value)) { - if (type === 'minlength') { - type = 'minlengthstring'; - } - - if (type === 'maxlength') { - type = 'maxlengthstring'; - } - - if (type === 'exactlylength') { - type = 'exactlylengthstring'; - } - - if (type === 'betweenlength') { - type = 'betweenlengthstring'; - } - } - - const error = this.control.errors[key]; - - let message: string | null = null; - - if (Types.isString(error['message'])) { - message = this.localizer.get(error['message']); - } - - if (!message) { - const args = { ...error, field: this.displayFieldName }; - - message = this.localizer.getOrKey(`validation.${type}`, args); - - } + const message = formatError(this.localizer, this.displayFieldName, key, this.control.errors[key], this.control.value); if (message) { errors.push(message); diff --git a/frontend/app/framework/angular/forms/editors/date-time-editor.component.html b/frontend/app/framework/angular/forms/editors/date-time-editor.component.html index 2d0095a86..f9f763363 100644 --- a/frontend/app/framework/angular/forms/editors/date-time-editor.component.html +++ b/frontend/app/framework/angular/forms/editors/date-time-editor.component.html @@ -27,7 +27,7 @@
-
diff --git a/frontend/app/framework/angular/forms/editors/date-time-editor.component.ts b/frontend/app/framework/angular/forms/editors/date-time-editor.component.ts index f673d1074..408664035 100644 --- a/frontend/app/framework/angular/forms/editors/date-time-editor.component.ts +++ b/frontend/app/framework/angular/forms/editors/date-time-editor.component.ts @@ -142,6 +142,16 @@ export class DateTimeEditorComponent extends StatefulControlComponent<{}, string this.updateControls(); } + public writeToday() { + this.dateTime = new DateTime(DateHelper.getLocalDate(DateTime.today().raw)); + + this.updateControls(); + this.callChangeFormatted(); + this.callTouched(); + + return false; + } + public writeNow() { this.dateTime = DateTime.now(); diff --git a/frontend/app/framework/angular/forms/error-formatting.spec.ts b/frontend/app/framework/angular/forms/error-formatting.spec.ts new file mode 100644 index 000000000..d5cca057b --- /dev/null +++ b/frontend/app/framework/angular/forms/error-formatting.spec.ts @@ -0,0 +1,191 @@ +/* + * Squidex Headless CMS + * + * @license + * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. + */ + +import { FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms'; +import { LocalizerService } from './../../services/localizer.service'; +import { formatError } from './error-formatting'; +import { ValidatorsEx } from './validators'; + +describe('formatErrors', () => { + const localizer = new LocalizerService({ + 'users.passwordConfirmValidationMessage': 'Passwords must be the same.', + 'validation.between': '{field} must be between \'{min}\' and \'{max}\'.', + 'validation.betweenlength': '{field|upper} must have between {minlength} and {maxlength} item(s).', + 'validation.betweenlengthstring': '{field|upper} must have between {minlength} and {maxlength} character(s).', + 'validation.email': '{field|upper} must be an email address.', + 'validation.exactly': '{field|upper} must be exactly \'{expected}\'.', + 'validation.exactlylength': '{field|upper} must have exactly {expected} item(s).', + 'validation.exactlylengthstring': '{field|upper} must have exactly {expected} character(s).', + 'validation.match': '{message}', + 'validation.max': '{field|upper} must be less or equal to \'{max}\'.', + 'validation.maxlength': '{field|upper} must not have more than {requiredlength} item(s).', + 'validation.maxlengthstring': '{field|upper} must not have more than {requiredlength} character(s).', + 'validation.min': '{field|upper} must be greater or equal to \'{min}\'.', + 'validation.minlength': '{field|upper} must have at least {requiredlength} item(s).', + 'validation.minlengthstring': '{field|upper} must have at least {requiredlength} character(s).', + 'validation.pattern': '{field|upper} does not match to the pattern.', + 'validation.patternmessage': '{message}', + 'validation.required': '{field|upper} is required.', + 'validation.requiredTrue': '{field|upper} is required.', + 'validation.uniquestrings': '{field|upper} must not contain duplicate values.', + 'validation.validarrayvalues': '{field|upper} contains an invalid value: {invalidvalue}.', + 'validation.validdatetime': '{field|upper} is not a valid date time.', + 'validation.validvalues': '{field|upper} is not a valid value.' + }); + + it('should format min', () => { + const error = validate(1, Validators.min(2)); + + expect(error).toEqual('MY_FIELD must be greater or equal to \'2\'.'); + }); + + it('should format max', () => { + const error = validate(3, Validators.max(2)); + + expect(error).toEqual('MY_FIELD must be less or equal to \'2\'.'); + }); + + it('should format required', () => { + const error = validate(undefined, Validators.required); + + expect(error).toEqual('MY_FIELD is required.'); + }); + + it('should format requiredTrue', () => { + const error = validate(undefined, Validators.requiredTrue); + + expect(error).toEqual('MY_FIELD is required.'); + }); + + it('should format email', () => { + const error = validate('invalid', Validators.email); + + expect(error).toEqual('MY_FIELD must be an email address.'); + }); + + it('should format minLength string', () => { + const error = validate('x', Validators.minLength(2)); + + expect(error).toEqual('MY_FIELD must have at least 2 character(s).'); + }); + + it('should format maxLength string', () => { + const error = validate('xxx', Validators.maxLength(2)); + + expect(error).toEqual('MY_FIELD must not have more than 2 character(s).'); + }); + + it('should format minLength array', () => { + const error = validate([1], Validators.minLength(2)); + + expect(error).toEqual('MY_FIELD must have at least 2 item(s).'); + }); + + it('should format maxLength array', () => { + const error = validate([1, 1, 1], Validators.maxLength(2)); + + expect(error).toEqual('MY_FIELD must not have more than 2 item(s).'); + }); + + it('should format match', () => { + const error = validate('123', Validators.pattern('[A-Z]')); + + expect(error).toEqual('MY_FIELD does not match to the pattern.'); + }); + + it('should format match with message', () => { + const error = validate('123', ValidatorsEx.pattern('[A-Z]', 'Custom Message')); + + expect(error).toEqual('Custom Message'); + }); + + it('should format between exactly', () => { + const error = validate(2, ValidatorsEx.between(3, 3)); + + expect(error).toEqual('MY_FIELD must be exactly \'3\'.'); + }); + + it('should format between range', () => { + const error = validate(2, ValidatorsEx.between(3, 5)); + + expect(error).toEqual('MY_FIELD must be between \'3\' and \'5\'.'); + }); + + it('should format betweenLength string exactly', () => { + const error = validate('xx', ValidatorsEx.betweenLength(3, 3)); + + expect(error).toEqual('MY_FIELD must have exactly 3 character(s).'); + }); + + it('should format betweenLength string range', () => { + const error = validate('xx', ValidatorsEx.betweenLength(3, 5)); + + expect(error).toEqual('MY_FIELD must have between 3 and 5 character(s).'); + }); + + it('should format betweenLength array exactly', () => { + const error = validate([1], ValidatorsEx.betweenLength(3, 3)); + + expect(error).toEqual('MY_FIELD must have exactly 3 item(s).'); + }); + + it('should format betweenLength array range', () => { + const error = validate([1, 1], ValidatorsEx.betweenLength(3, 5)); + + expect(error).toEqual('MY_FIELD must have between 3 and 5 item(s).'); + }); + + it('should format validDateTime', () => { + const error = validate('invalid', ValidatorsEx.validDateTime()); + + expect(error).toEqual('MY_FIELD is not a valid date time.'); + }); + + it('should format validValues', () => { + const error = validate(5, ValidatorsEx.validValues([1, 2, 3])); + + expect(error).toEqual('MY_FIELD is not a valid value.'); + }); + + it('should format validArrayValues', () => { + const error = validate([2, 4], ValidatorsEx.validArrayValues([1, 2, 3])); + + expect(error).toEqual('MY_FIELD contains an invalid value: 4.'); + }); + + it('should format uniqueStrings', () => { + const error = validate(['1', '2', '2', '3'], ValidatorsEx.uniqueStrings()); + + expect(error).toEqual('MY_FIELD must not contain duplicate values.'); + }); + + it('should format match', () => { + const formControl1 = new FormControl(1); + const formControl2 = new FormControl(2); + + const formGroup = new FormGroup({ + field1: formControl1, + field2: formControl2 + }); + + const formError = ValidatorsEx.match('field2', 'i18n:users.passwordConfirmValidationMessage')!(formControl1)!; + const formMessage = formatError(localizer, 'MY_FIELD', Object.keys(formError)[0], Object.values(formError)[0], undefined); + + expect(formMessage).toEqual('Passwords must be the same.'); + + formGroup.reset(); + }); + + function validate(value: any, validator: ValidatorFn) { + const formControl = new FormControl(value); + + const formError = validator(formControl)!; + const formMessage = formatError(localizer, 'MY_FIELD', Object.keys(formError)[0], Object.values(formError)[0], value); + + return formMessage; + } +}); \ No newline at end of file diff --git a/frontend/app/framework/angular/forms/error-formatting.ts b/frontend/app/framework/angular/forms/error-formatting.ts new file mode 100644 index 000000000..6feec8670 --- /dev/null +++ b/frontend/app/framework/angular/forms/error-formatting.ts @@ -0,0 +1,47 @@ +/* + * Squidex Headless CMS + * + * @license + * Copyright (c) Sebastian Stehle. All rights r vbeserved + */ + +import { Types } from '@app/framework/internal'; +import { LocalizerService } from '@app/shared'; + +export function formatError(localizer: LocalizerService, field: string, type: string, properties: any, value: any, errors?: any) { + type = type.toLowerCase(); + + if (Types.isString(value)) { + if (type === 'minlength') { + type = 'minlengthstring'; + } + + if (type === 'maxlength') { + type = 'maxlengthstring'; + } + + if (type === 'exactlylength') { + type = 'exactlylengthstring'; + } + + if (type === 'betweenlength') { + type = 'betweenlengthstring'; + } + } + + let message: string | null = properties['message']; + + if (!Types.isString(message) && errors) { + message = errors[type]; + } + + if (!Types.isString(message)) { + message = `validation.${type}`; + } + + const args = { ...properties, field }; + + message = localizer.getOrKey(message, args); + + return message; +} \ No newline at end of file diff --git a/frontend/app/framework/services/localizer.service.spec.ts b/frontend/app/framework/services/localizer.service.spec.ts index 06ac7e7a5..f5a6685a0 100644 --- a/frontend/app/framework/services/localizer.service.spec.ts +++ b/frontend/app/framework/services/localizer.service.spec.ts @@ -12,6 +12,7 @@ describe('LocalizerService', () => { simple: 'Simple Result', withLowerVar: 'Var: {var|lower}.', withUpperVar: 'Var: {var|upper}.', + withMultiple: 'Text1: {text1}, Text2: {Text2}.', withVar: 'Var: {var}.' }; @@ -82,4 +83,12 @@ describe('LocalizerService', () => { expect(result).toEqual('Var: Upper.'); }); + + it('should return text with multiple variables', () => { + const localizer = new LocalizerService(translations); + + const result = localizer.get('withMultiple', { Text1: 'Hello', Text2: 'World' }); + + expect(result).toEqual('Text1: Hello, Text2: World.'); + }); }); \ No newline at end of file diff --git a/frontend/app/framework/services/localizer.service.ts b/frontend/app/framework/services/localizer.service.ts index e593cf1f1..8ab428677 100644 --- a/frontend/app/framework/services/localizer.service.ts +++ b/frontend/app/framework/services/localizer.service.ts @@ -6,6 +6,7 @@ */ import { Injectable } from '@angular/core'; +import { compareStrings } from '../utils/array-helper'; export const LocalizerServiceFactory = (translations: Object) => { return new LocalizerService(translations); @@ -56,46 +57,62 @@ export class LocalizerService { return text; } - private replaceVariables(text: string, args: ReadonlyArray): string { - while (true) { - const indexOfStart = text.indexOf('{'); + private replaceVariables(text: string, args: object): string { + text = text.replace(/{[^}]*}/g, (matched: string) => { + const inner = matched.substr(1, matched.length - 2); - if (indexOfStart < 0) { - break; - } - - const indexOfEnd = text.indexOf('}'); + let replaceValue: string; - const replace = text.substring(indexOfStart, indexOfEnd + 1); + if (matched.includes('|')) { + const splittedValue = inner.split('|'); - text = text.replace(replace, (matched: string) => { - let replaceValue: string; + const key = splittedValue[0]; - if (matched.includes('|')) { - const splittedValue = matched.split('|'); + replaceValue = this.getVar(args, key); - replaceValue = this.handlePipeOption(args[splittedValue[0].substr(1)], splittedValue[1].slice(0, -1)); - } else { - const key = matched.substring(1, matched.length - 1); + if (replaceValue) { + const transforms = splittedValue.slice(1); - replaceValue = args[key]; + replaceValue = this.transform(replaceValue, transforms); } + } else { + replaceValue = this.getVar(args, inner); + } - return replaceValue; - }); - } + return replaceValue; + }); return text; } - private handlePipeOption(value: string, pipeOption: string) { - switch (pipeOption) { - case 'lower': - return value.charAt(0).toLowerCase() + value.slice(1); - case 'upper': - return value.charAt(0).toUpperCase() + value.slice(1); - default: - return value; + private getVar(args: object, key: string) { + let value = args[key]; + + if (!value) { + for (const name in args) { + if (args.hasOwnProperty(name) && compareStrings(key, name) === 0) { + value = args[name]; + + break; + } + } + } + + return value; + } + + private transform(value: string, transforms: ReadonlyArray) { + for (const transform of transforms) { + switch (transform) { + case 'lower': + value = value.charAt(0).toLowerCase() + value.slice(1); + break; + case 'upper': + value = value.charAt(0).toUpperCase() + value.slice(1); + break; + } } + + return value; } } \ No newline at end of file diff --git a/frontend/app/shared/state/contents.forms.spec.ts b/frontend/app/shared/state/contents.forms.spec.ts index f61c84ca4..de10c59de 100644 --- a/frontend/app/shared/state/contents.forms.spec.ts +++ b/frontend/app/shared/state/contents.forms.spec.ts @@ -259,12 +259,18 @@ describe('DateTimeField', () => { expect(FieldFormatter.format(dateField, '2017-12-12')).toBe('12/12/2017'); }); - it('should format to date', () => { + it('should format datetime to date', () => { const dateField = createField({ properties: createProperties('DateTime', { editor: 'Date' }) }); expect(FieldFormatter.format(dateField, '2017-12-12T16:00:00Z')).toBe('12/12/2017'); }); + it('should format date to date', () => { + const dateField = createField({ properties: createProperties('DateTime', { editor: 'Date' }) }); + + expect(FieldFormatter.format(dateField, '2017-12-12T00:00:00Z')).toBe('12/12/2017'); + }); + it('should format to date time', () => { const field2 = createField({ properties: createProperties('DateTime', { editor: 'DateTime' }) }); diff --git a/frontend/app/shared/state/contents.forms.visitors.ts b/frontend/app/shared/state/contents.forms.visitors.ts index 2b426a72d..920b96456 100644 --- a/frontend/app/shared/state/contents.forms.visitors.ts +++ b/frontend/app/shared/state/contents.forms.visitors.ts @@ -130,7 +130,7 @@ export class FieldFormatter implements FieldPropertiesVisitor { const parsed = DateTime.parseISO(this.value); if (properties.editor === 'Date') { - return parsed.toStringFormat('P'); + return parsed.toStringFormatUTC('P'); } else { return parsed.toStringFormat('Ppp'); } diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 33019984c..a9536bb14 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -5,14 +5,15 @@ "requires": true, "dependencies": { "@angular-devkit/build-optimizer": { - "version": "0.1000.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1000.7.tgz", - "integrity": "sha512-7vnj++astDMnsTPEiXgpXCTwo/zbFmJadKTIlHoU9VHxQNwSfPwSCtPuPlxynquJu5zxhs24CNUBLXXH8z9ztQ==", + "version": "0.1001.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1001.1.tgz", + "integrity": "sha512-ZjIK0YuE1lQ5X1YM+WAxuuJ5g/g7F97YXlDXEo8wsfIia6dAW4gI7Q8f+lgoqxBwgmxuYEyd4DFHNZZqnH3smQ==", "dev": true, "requires": { "loader-utils": "2.0.0", "source-map": "0.7.3", - "tslib": "2.0.0", + "tslib": "2.0.1", + "typescript": "4.0.2", "webpack-sources": "1.4.3" }, "dependencies": { @@ -53,50 +54,26 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true - }, - "tslib": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", - "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==", - "dev": true - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } } } }, "@angular-devkit/core": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.0.7.tgz", - "integrity": "sha512-pXaZgsQ8LHpRx4QGAUYDE8GwBQLAtoqPh6oUCwRJwBExm5rl13OGPTBWewHiq0ysV/SnFXvOjxwAaHQvC1AgZw==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.1.tgz", + "integrity": "sha512-0ZmknL5I177JO+iOz2gDSqHtPK3zGGwyz4ix9IIu172eFRX53sdbl1vDiMikovyvZWx5fXqU3Vazf7CUeGA28w==", "dev": true, "requires": { - "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" }, "dependencies": { "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -124,9 +101,9 @@ "dev": true }, "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -145,9 +122,9 @@ "dev": true }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -156,43 +133,43 @@ } }, "@angular/animations": { - "version": "10.0.11", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-10.0.11.tgz", - "integrity": "sha512-nTw9KctjWE+8Jt3TFJu9c7rPT48FRCqEsTvfzcQW0aq4+s6htmnH0DUY26dCVHjvTNoH71jJyA4IsV0ICTw15A==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-10.1.1.tgz", + "integrity": "sha512-acVxTTGzA5JEspFNyhZKyr/wgCTCDL13fzz9CxMdMY3vgqgy/PiqmMp54MBI37EqgEOCo+PBJSX9uXxF0HqHTw==", "requires": { "tslib": "^2.0.0" } }, "@angular/cdk": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-10.1.3.tgz", - "integrity": "sha512-xMV1M41mfuaQod4rtAG/duYiWffGIC2C87E1YuyHTh8SEcHopGVRQd2C8PWH+iwinPbes7AjU1uzCEvmOYikrA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-10.2.0.tgz", + "integrity": "sha512-KYEBOuGimnWtYS8KvLz/dPWC2pzDzKh1ETkvyJCSm5yXZgNPdj1XatbGQrnQgy9vJwxjbZQ1s8P9tzWx1Dj7dg==", "requires": { "parse5": "^5.0.0", "tslib": "^2.0.0" } }, "@angular/common": { - "version": "10.0.11", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-10.0.11.tgz", - "integrity": "sha512-Y0EKuwA+LBl1QbyitgLkzjRMqOya3fWsl+LqJkXODCg7+aLi69hzhov0qOxkomLyAZhSTD4B7K6etHKDqhLlQQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-10.1.1.tgz", + "integrity": "sha512-RqFUdDU5x6KgFfT2o1fEn2GmxehtqCt9wYfKIaXMtAEPj0LGmc5A/YllxedASnIwlDHxsKL12b0Mc+g3r00zVg==", "requires": { "tslib": "^2.0.0" } }, "@angular/compiler": { - "version": "10.0.11", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.0.11.tgz", - "integrity": "sha512-v1dA2Nxv0hgXVnpLBcLam7etEArQuvzV15H/0QHZ0xFAsdYu2VZSI1vrB5jlujEfWnNzNhPYNosSQMPnjTkbGw==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.1.1.tgz", + "integrity": "sha512-VJ5eeYBsHR6WzCIKhBsGPYd6zfPNXqD0hD2SAjHqTb/LPnhSPsHGKBzuck+CxvXwChbjKNWzdMPuMAKGahR2ow==", "dev": true, "requires": { "tslib": "^2.0.0" } }, "@angular/compiler-cli": { - "version": "10.0.11", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.0.11.tgz", - "integrity": "sha512-65bk23SSuvzFRRh/JfMHRd/S+LcRLaUut9QXWg+wo++en4ctgAPRQ5GLb1dd4ys058bX6l0BTCd2SFRz+44qCA==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.1.1.tgz", + "integrity": "sha512-xpXIt1l6i2QHIkxezkMt87caRZeAs1ls+MgW4EVx62SGzWLB164BFmJ3nshZX53aX68y0x83RS5JENxlANasPA==", "dev": true, "requires": { "canonical-path": "1.0.0", @@ -219,185 +196,51 @@ } }, "@angular/core": { - "version": "10.0.11", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-10.0.11.tgz", - "integrity": "sha512-9kv+4JmsIVkbGG8NSmtgEFkm8QtFr/TXjyrqEzl81qlZwSG3FpcqQGG0qb2hlwX81LoWQenbBY0g21yTciEZjA==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-10.1.1.tgz", + "integrity": "sha512-3mvsaZJPg5Z8sGBT0OW3ak0T/UmHmlQ0nkWjwnIdPrMbyv5GoAjTR3Zh3cRK57nGV7ScLk4m4B4INzAjoCDqeA==", "requires": { "tslib": "^2.0.0" } }, "@angular/forms": { - "version": "10.0.11", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.0.11.tgz", - "integrity": "sha512-nG7D7oS0Fa9W9y0khgDuc2zv1RLnZ+5amXKjuRSVTtZSFLjKlAVYJ2UKyTeW2NI00zMs6oX5dxvoFQ9n3QViMw==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.1.1.tgz", + "integrity": "sha512-p6bsRNG2ctpo6tTDKCZZcbH/lFy1+0OlS8flFoEpMVwVrCg2PtjdlP76mMcmJjvUWdC/c3ySyrODm2bu2H59FQ==", "requires": { "tslib": "^2.0.0" } }, "@angular/localize": { - "version": "10.0.11", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-10.0.11.tgz", - "integrity": "sha512-X8R2oSIzMo5Ha8QB93k9S2AYjvpe+haWVBCQIk7XQ1QZ8CynJCSFK9QwUGGUKsCUlNycDJ+sWpP5+fLdQmjPMQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-10.1.1.tgz", + "integrity": "sha512-8ssWbT2tI7aa2KIIpl/gx1nse0Nh6pvJVlb9z0TN0GvNz5lGeE7TbiW21wwDNFnJ7yuYKnK18lYKlpsAFKqGeg==", "requires": { "@babel/core": "7.8.3", "glob": "7.1.2", "yargs": "15.3.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz", - "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==", - "requires": { - "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-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } } }, "@angular/platform-browser": { - "version": "10.0.11", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.0.11.tgz", - "integrity": "sha512-u3kXnnsuKRUTeA47+SnmGUhs1k9HKVm3rKaXUfqbHouDHz2SMQg/bvWBG5Nq8FFZYdNa3lV6q1l03/Zf7kaZNg==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.1.1.tgz", + "integrity": "sha512-rbI4fu6HRj7b+6MB8HWOdaYmV3CSjOyyrVqWAcNuXfNwZk/KE/OHvLSvQf7dMKnatJARa9bMrZdSQZqPuig1hA==", "requires": { "tslib": "^2.0.0" } }, "@angular/platform-browser-dynamic": { - "version": "10.0.11", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.0.11.tgz", - "integrity": "sha512-FULvtpVBSEHW13CbsoJminvaKtTZETSvmdDqE1NfHtcYZ6YYksc/ipq4elFFZScIITPDvVqoJxlZXX9DC3kKSA==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.1.1.tgz", + "integrity": "sha512-mYd5ulQ0HYRwbgALegL6W7OlkDLNOlXp3gLLAoNjRfsb4+EocDiR8A4uf1LajL3Qunq3k7XBrcdT1SEQmqu4BQ==", "requires": { "tslib": "^2.0.0" } }, "@angular/platform-server": { - "version": "10.0.11", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-10.0.11.tgz", - "integrity": "sha512-Dj5ohDybE6aGxGggCtl0r66HWhyQgr5cYAANGznbflqKa8CXtfUZgHgF8nvdBwkkEcdeEtQnhTHfWt+peL997A==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-10.1.1.tgz", + "integrity": "sha512-6LeAN+kHgtXQcD0dHf0rbGZMRcFRRoRxcHsF/jjp46n0exNM+wkZo+2XMzaQgRHqbVIsGRFHoPm2od/ZZqxqzQ==", "requires": { "domino": "^2.1.2", "tslib": "^2.0.0", @@ -405,9 +248,9 @@ } }, "@angular/router": { - "version": "10.0.11", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-10.0.11.tgz", - "integrity": "sha512-YFXBfW1EEq+y+lcYoZuvH1jeyD9ku9N7V5SZi8Ux8KZZ+CjnWRx2bt4PF7fezCGRO6KgfM0xrZI8TKmYOK5OSQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-10.1.1.tgz", + "integrity": "sha512-f9OI9k6OKzraBsh5/HeG8H7ubi3r+Sveu7sRIBvvzeoUj0uFHRkB2IDIxQHJWBBWUPyPmyvWCJVigUvcJyyarw==", "requires": { "tslib": "^2.0.0" } @@ -471,11 +314,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -489,20 +327,15 @@ } }, "@babel/generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", - "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", + "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", "requires": { - "@babel/types": "^7.11.0", + "@babel/types": "^7.11.5", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -528,14 +361,6 @@ "@babel/types": "^7.10.4" } }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "requires": { - "@babel/types": "^7.10.4" - } - }, "@babel/helper-split-export-declaration": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", @@ -570,24 +395,9 @@ } }, "@babel/parser": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", - "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" - }, - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - } - } + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", + "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==" }, "@babel/template": { "version": "7.10.4", @@ -600,16 +410,16 @@ } }, "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", + "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", "requires": { "@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" @@ -641,9 +451,9 @@ } }, "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", "requires": { "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.19", @@ -676,189 +486,40 @@ "@types/hammerjs": "^2.0.36" } }, - "@emotion/cache": { - "version": "10.0.29", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz", - "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", - "requires": { - "@emotion/sheet": "0.9.4", - "@emotion/stylis": "0.8.5", - "@emotion/utils": "0.11.3", - "@emotion/weak-memoize": "0.2.5" - } - }, - "@emotion/core": { - "version": "10.0.35", - "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.35.tgz", - "integrity": "sha512-sH++vJCdk025fBlRZSAhkRlSUoqSqgCzYf5fMOmqqi3bM6how+sQpg3hkgJonj8GxXM4WbD7dRO+4tegDB9fUw==", - "requires": { - "@babel/runtime": "^7.5.5", - "@emotion/cache": "^10.0.27", - "@emotion/css": "^10.0.27", - "@emotion/serialize": "^0.11.15", - "@emotion/sheet": "0.9.4", - "@emotion/utils": "0.11.3" - } - }, - "@emotion/css": { - "version": "10.0.27", - "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.27.tgz", - "integrity": "sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==", - "requires": { - "@emotion/serialize": "^0.11.15", - "@emotion/utils": "0.11.3", - "babel-plugin-emotion": "^10.0.27" - } - }, - "@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, - "@emotion/is-prop-valid": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", - "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", - "requires": { - "@emotion/memoize": "0.7.4" - } - }, - "@emotion/memoize": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" - }, - "@emotion/serialize": { - "version": "0.11.16", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", - "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", - "requires": { - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/unitless": "0.7.5", - "@emotion/utils": "0.11.3", - "csstype": "^2.5.7" - } - }, - "@emotion/sheet": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz", - "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==" - }, - "@emotion/styled": { - "version": "10.0.27", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-10.0.27.tgz", - "integrity": "sha512-iK/8Sh7+NLJzyp9a5+vIQIXTYxfT4yB/OJbjzQanB2RZpvmzBQOHZWhpAMZWYEKRNNbsD6WfBw5sVWkb6WzS/Q==", - "requires": { - "@emotion/styled-base": "^10.0.27", - "babel-plugin-emotion": "^10.0.27" - } - }, - "@emotion/styled-base": { - "version": "10.0.31", - "resolved": "https://registry.npmjs.org/@emotion/styled-base/-/styled-base-10.0.31.tgz", - "integrity": "sha512-wTOE1NcXmqMWlyrtwdkqg87Mu6Rj1MaukEoEmEkHirO5IoHDJ8LgCQL4MjJODgxWxXibGR3opGp1p7YvkNEdXQ==", - "requires": { - "@babel/runtime": "^7.5.5", - "@emotion/is-prop-valid": "0.8.8", - "@emotion/serialize": "^0.11.15", - "@emotion/utils": "0.11.3" - } - }, - "@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" - }, - "@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - }, - "@emotion/utils": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", - "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" - }, - "@emotion/weak-memoize": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", - "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" - }, - "@mdx-js/react": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.16.tgz", - "integrity": "sha512-+FhuSVOPo7+4fZaRwWuCSRUcZkJOkZu0rfAbBKvoCg1LWb1Td8Vzi0DTLORdSvgWNbU6+EL40HIgwTOs00x2Jw==" - }, "@ngtools/webpack": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-10.0.7.tgz", - "integrity": "sha512-yUjTDOgsuEJEtsyqb78jDm3Keo18x6j1AjmZUEeiCxShX2pBQTfErmxtBqxPUAkLa/gD7Wkf5cZM+3xcYyShRg==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-10.1.1.tgz", + "integrity": "sha512-OByWcvyJy4S4bxVcRCNVMRIyK4+j6XZPDI2K2vS6DZ6Bg/GUnabHMTCS+50RSAYvoaF2Gh0qCCXCA6QbGrSSDw==", "dev": true, "requires": { - "@angular-devkit/core": "10.0.7", - "enhanced-resolve": "4.1.1", - "rxjs": "6.5.5", + "@angular-devkit/core": "10.1.1", + "enhanced-resolve": "4.3.0", "webpack-sources": "1.4.3" }, "dependencies": { - "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", "dev": true, "requires": { - "tslib": "^1.9.0" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" } }, - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", "dev": true, "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } } } }, - "@ngx-translate/core": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-13.0.0.tgz", - "integrity": "sha512-+tzEp8wlqEnw0Gc7jtVRAJ6RteUjXw6JJR4O65KlnxOmJrCGPI0xjV/lKRnQeU0w4i96PQs/jtpL921Wrb7PWg==", - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", - "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==" - } - } - }, - "@ngx-translate/http-loader": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-6.0.0.tgz", - "integrity": "sha512-LCekn6qCbeXWlhESCxU1rAbZz33WzDG0lI7Ig0pYC1o5YxJWrkU9y3Y4tNi+jakQ7R6YhTR2D3ox6APxDtA0wA==", - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", - "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==" - } - } - }, "@nodelib/fs.scandir": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", @@ -902,192 +563,6 @@ } } }, - "@styled-system/background": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/background/-/background-5.1.2.tgz", - "integrity": "sha512-jtwH2C/U6ssuGSvwTN3ri/IyjdHb8W9X/g8Y0JLcrH02G+BW3OS8kZdHphF1/YyRklnrKrBT2ngwGUK6aqqV3A==", - "requires": { - "@styled-system/core": "^5.1.2" - } - }, - "@styled-system/border": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@styled-system/border/-/border-5.1.5.tgz", - "integrity": "sha512-JvddhNrnhGigtzWRCVuAHepniyVi6hBlimxWDVAdcTuk7aRn9BYJUwfHslURtwYFsF5FoEs8Zmr1oZq2M1AP0A==", - "requires": { - "@styled-system/core": "^5.1.2" - } - }, - "@styled-system/color": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/color/-/color-5.1.2.tgz", - "integrity": "sha512-1kCkeKDZkt4GYkuFNKc7vJQMcOmTl3bJY3YBUs7fCNM6mMYJeT1pViQ2LwBSBJytj3AB0o4IdLBoepgSgGl5MA==", - "requires": { - "@styled-system/core": "^5.1.2" - } - }, - "@styled-system/core": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/core/-/core-5.1.2.tgz", - "integrity": "sha512-XclBDdNIy7OPOsN4HBsawG2eiWfCcuFt6gxKn1x4QfMIgeO6TOlA2pZZ5GWZtIhCUqEPTgIBta6JXsGyCkLBYw==", - "requires": { - "object-assign": "^4.1.1" - } - }, - "@styled-system/css": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@styled-system/css/-/css-5.1.5.tgz", - "integrity": "sha512-XkORZdS5kypzcBotAMPBoeckDs9aSZVkvrAlq5K3xP8IMAUek+x2O4NtwoSgkYkWWzVBu6DGdFZLR790QWGG+A==" - }, - "@styled-system/flexbox": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/flexbox/-/flexbox-5.1.2.tgz", - "integrity": "sha512-6hHV52+eUk654Y1J2v77B8iLeBNtc+SA3R4necsu2VVinSD7+XY5PCCEzBFaWs42dtOEDIa2lMrgL0YBC01mDQ==", - "requires": { - "@styled-system/core": "^5.1.2" - } - }, - "@styled-system/grid": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/grid/-/grid-5.1.2.tgz", - "integrity": "sha512-K3YiV1KyHHzgdNuNlaw8oW2ktMuGga99o1e/NAfTEi5Zsa7JXxzwEnVSDSBdJC+z6R8WYTCYRQC6bkVFcvdTeg==", - "requires": { - "@styled-system/core": "^5.1.2" - } - }, - "@styled-system/layout": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/layout/-/layout-5.1.2.tgz", - "integrity": "sha512-wUhkMBqSeacPFhoE9S6UF3fsMEKFv91gF4AdDWp0Aym1yeMPpqz9l9qS/6vjSsDPF7zOb5cOKC3tcKKOMuDCPw==", - "requires": { - "@styled-system/core": "^5.1.2" - } - }, - "@styled-system/position": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/position/-/position-5.1.2.tgz", - "integrity": "sha512-60IZfMXEOOZe3l1mCu6sj/2NAyUmES2kR9Kzp7s2D3P4qKsZWxD1Se1+wJvevb+1TP+ZMkGPEYYXRyU8M1aF5A==", - "requires": { - "@styled-system/core": "^5.1.2" - } - }, - "@styled-system/shadow": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/shadow/-/shadow-5.1.2.tgz", - "integrity": "sha512-wqniqYb7XuZM7K7C0d1Euxc4eGtqEe/lvM0WjuAFsQVImiq6KGT7s7is+0bNI8O4Dwg27jyu4Lfqo/oIQXNzAg==", - "requires": { - "@styled-system/core": "^5.1.2" - } - }, - "@styled-system/should-forward-prop": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@styled-system/should-forward-prop/-/should-forward-prop-5.1.5.tgz", - "integrity": "sha512-+rPRomgCGYnUIaFabDoOgpSDc4UUJ1KsmlnzcEp0tu5lFrBQKgZclSo18Z1URhaZm7a6agGtS5Xif7tuC2s52Q==", - "requires": { - "@emotion/is-prop-valid": "^0.8.1", - "@emotion/memoize": "^0.7.1", - "styled-system": "^5.1.5" - } - }, - "@styled-system/space": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/space/-/space-5.1.2.tgz", - "integrity": "sha512-+zzYpR8uvfhcAbaPXhH8QgDAV//flxqxSjHiS9cDFQQUSznXMQmxJegbhcdEF7/eNnJgHeIXv1jmny78kipgBA==", - "requires": { - "@styled-system/core": "^5.1.2" - } - }, - "@styled-system/typography": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/typography/-/typography-5.1.2.tgz", - "integrity": "sha512-BxbVUnN8N7hJ4aaPOd7wEsudeT7CxarR+2hns8XCX1zp0DFfbWw4xYa/olA0oQaqx7F1hzDg+eRaGzAJbF+jOg==", - "requires": { - "@styled-system/core": "^5.1.2" - } - }, - "@styled-system/variant": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@styled-system/variant/-/variant-5.1.5.tgz", - "integrity": "sha512-Yn8hXAFoWIro8+Q5J8YJd/mP85Teiut3fsGVR9CAxwgNfIAiqlYxsk5iHU7VHJks/0KjL4ATSjmbtCDC/4l1qw==", - "requires": { - "@styled-system/core": "^5.1.2", - "@styled-system/css": "^5.1.5" - } - }, - "@theme-ui/color-modes": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@theme-ui/color-modes/-/color-modes-0.3.1.tgz", - "integrity": "sha512-WuZGgFW7M5wOWSse1PVZCEfM0OZip15/D6U3bB3B9KmWax7qiSnAm1yAMLRQKC+QYhndrjq3xU+WAQm11KnhIw==", - "requires": { - "@emotion/core": "^10.0.0", - "@theme-ui/core": "^0.3.1", - "@theme-ui/css": "^0.3.1", - "deepmerge": "^4.2.2" - }, - "dependencies": { - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" - } - } - }, - "@theme-ui/components": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@theme-ui/components/-/components-0.3.1.tgz", - "integrity": "sha512-uG4dUM61s4tWv6N34uxs5VIh24bJyA/7TrYJ75WDiI+s72zbcNG7aGRpvX/hSZnAhxjdXpuskdEM3eEgOabdEg==", - "requires": { - "@emotion/core": "^10.0.0", - "@emotion/styled": "^10.0.0", - "@styled-system/color": "^5.1.2", - "@styled-system/should-forward-prop": "^5.1.2", - "@styled-system/space": "^5.1.2", - "@theme-ui/css": "^0.3.1" - } - }, - "@theme-ui/core": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@theme-ui/core/-/core-0.3.1.tgz", - "integrity": "sha512-cK6EVSOx0Kyx1Xpi4qb0JTLIxywx0DRh+53Ln1foXMplF2qKaDsFi3vD6duHIlT331E3CNOa9dftHHNM7y4rbA==", - "requires": { - "@emotion/core": "^10.0.0", - "@theme-ui/css": "^0.3.1", - "deepmerge": "^4.2.2" - }, - "dependencies": { - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" - } - } - }, - "@theme-ui/css": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@theme-ui/css/-/css-0.3.1.tgz", - "integrity": "sha512-QB2/fZBpo4inaLHL3OrB8NOBgNfwnj8GtHzXWHb9iQSRjmtNX8zPXBe32jLT7qQP0+y8JxPT4YChZIkm5ZyIdg==" - }, - "@theme-ui/mdx": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@theme-ui/mdx/-/mdx-0.3.0.tgz", - "integrity": "sha512-/GHBNKqmUptWwkmF+zIASVQtjYs81XMEwtqPCHnHuaaCzhZxcXrtCwvcAgmCXF8hpRttCXVVxw1X3Gt0mhzaTQ==", - "requires": { - "@emotion/core": "^10.0.0", - "@emotion/styled": "^10.0.0", - "@mdx-js/react": "^1.0.0" - } - }, - "@theme-ui/theme-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@theme-ui/theme-provider/-/theme-provider-0.3.1.tgz", - "integrity": "sha512-Sjj6lD0gPxBi+hcGCkawcGZECeESV/mW2YfmPqjNgmc296x5tulfNc+0/N5CJwLVOmnkn8zR5KNWZ8BjndfeTg==", - "requires": { - "@emotion/core": "^10.0.0", - "@theme-ui/color-modes": "^0.3.1", - "@theme-ui/core": "^0.3.1", - "@theme-ui/mdx": "^0.3.0" - } - }, "@types/anymatch": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", @@ -1095,9 +570,9 @@ "dev": true }, "@types/codemirror": { - "version": "0.0.97", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.97.tgz", - "integrity": "sha512-n5d7o9nWhC49DjfhsxANP7naWSeTzrjXASkUDQh7626sM4zK9XP2EVcHp1IcCf/IPV6c7ORzDUDF3Bkt231VKg==", + "version": "0.0.98", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.98.tgz", + "integrity": "sha512-cbty5LPayy2vNSeuUdjNA9tggG+go5vAxmnLDRWpiZI5a+RDBi9dlozy4/jW/7P/gletbBWbQREEa7A81YxstA==", "requires": { "@types/tern": "*" } @@ -1108,9 +583,9 @@ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, "@types/core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@types/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha512-F9RHpjuPSit4dCCRXgi7XcqA01DAjy9QY+v9yICoxXsjXD9cgQpyZyL2eSZnTkBGXGaQnea8waZOZTogLDB+rA==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@types/core-js/-/core-js-2.5.4.tgz", + "integrity": "sha512-Xwy8o12ak+iYgFr/KCVaVK5Sy+jFMiiPAID3+ObvMlBzy26XQJw5xu+a6rlHsrJENXj/AwJOGsJpVohUjAzSKQ==", "dev": true }, "@types/estree": { @@ -1140,9 +615,9 @@ "dev": true }, "@types/jasmine": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.13.tgz", - "integrity": "sha512-bVSrTEWdCNH2RHN+E0QlEr4pGPMRA6puKOmL/X13ZeZmUS0q12ZR1rkB9PVvJSX0zi/OXrMDNvUai+PC380+rQ==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.14.tgz", + "integrity": "sha512-Fkgk536sHPqcOtd+Ow+WiUNuk0TSo/BntKkF8wSvcd6M2FvPjeXcUE6Oz/bwDZiUZEaXLslAgw00Q94Pnx6T4w==", "dev": true }, "@types/jquery": { @@ -1191,15 +666,16 @@ "dev": true }, "@types/node": { - "version": "14.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.0.tgz", - "integrity": "sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA==", + "version": "14.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.10.1.tgz", + "integrity": "sha512-aYNbO+FZ/3KGeQCEkNhHFRIzBOUgc7QvcVNKXbfnhDkSfwUv91JsQQa10rDgKSTSLkXZ1UIyPe4FJJNVgw1xWQ==", "dev": true }, "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true }, "@types/prop-types": { "version": "15.7.3", @@ -1214,21 +690,13 @@ "dev": true }, "@types/react": { - "version": "16.9.46", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.46.tgz", - "integrity": "sha512-dbHzO3aAq1lB3jRQuNpuZ/mnu+CdD3H0WVaaBQA8LTT3S33xhVBUj232T8M3tAhSWJs/D/UqORYUlJNl/8VQZg==", + "version": "16.9.49", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.49.tgz", + "integrity": "sha512-DtLFjSj0OYAdVLBbyjhuV9CdGVHCkHn2R+xr3XkBvK2rS1Y1tkc14XSGjYgm5Fjjr90AxH9tiSzc1pCFMGO06g==", "dev": true, "requires": { "@types/prop-types": "*", "csstype": "^3.0.2" - }, - "dependencies": { - "csstype": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.2.tgz", - "integrity": "sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw==", - "dev": true - } } }, "@types/react-dom": { @@ -1291,9 +759,9 @@ } }, "@types/webpack": { - "version": "4.41.21", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.21.tgz", - "integrity": "sha512-2j9WVnNrr/8PLAB5csW44xzQSJwS26aOnICsP3pSGCEdsu6KYtfQ6QJsVUKHWRnm1bL7HziJsfh5fHqth87yKA==", + "version": "4.41.22", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.22.tgz", + "integrity": "sha512-JQDJK6pj8OMV9gWOnN1dcLCyU9Hzs6lux0wBO4lr1+gyEhIBR9U3FMrz12t2GPkg110XAxEAw2WHF6g7nZIbRQ==", "dev": true, "requires": { "@types/anymatch": "*", @@ -1613,9 +1081,9 @@ "dev": true }, "angular-gridster2": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/angular-gridster2/-/angular-gridster2-10.1.4.tgz", - "integrity": "sha512-jK5govAUQ4zKnVuNepsR3Qs8K9fUn5lLg4A4AKe9wsoRMEMdkSuCHh65ij4YePAxr44hky9Zy6EaCmVorBd8LA==", + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/angular-gridster2/-/angular-gridster2-10.1.5.tgz", + "integrity": "sha512-vOQx2dF/+94ubbHpwOoxUtJjgTxR6uK6mzg15CHHzqLX3PYiE1AdmxQsgXz2GsLnDX5VhWiq3A0m1sVVh+tsmA==", "requires": { "tslib": "^2.0.0" } @@ -2107,97 +1575,6 @@ "babel-runtime": "^6.22.0" } }, - "babel-plugin-emotion": { - "version": "10.0.33", - "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.33.tgz", - "integrity": "sha512-bxZbTTGz0AJQDHm8k6Rf3RQJ8tX2scsfsRyKVgAbiUPUNIRtlK+7JxP+TAd1kRLABFxe0CFm2VdK4ePkoA9FxQ==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/serialize": "^0.11.16", - "babel-plugin-macros": "^2.0.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^1.0.5", - "find-root": "^1.1.0", - "source-map": "^0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "requires": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", - "requires": { - "@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" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - } - } - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" - }, "babel-polyfill": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", @@ -2624,15 +2001,15 @@ } }, "browserslist": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz", - "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", + "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001111", - "electron-to-chromium": "^1.3.523", + "caniuse-lite": "^1.0.30001125", + "electron-to-chromium": "^1.3.564", "escalade": "^3.0.2", - "node-releases": "^1.1.60" + "node-releases": "^1.1.61" } }, "buffer": { @@ -2838,9 +2215,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001117", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001117.tgz", - "integrity": "sha512-4tY0Fatzdx59kYjQs+bNxUwZB03ZEBgVmJ1UkFPz/Q8OLiUUbjct2EdpnXj0fvFTPej2EkbPIG0w8BWsjAyk1Q==", + "version": "1.0.30001129", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001129.tgz", + "integrity": "sha512-9945fTVKS810DZITpsAbuhQG7Lam0tEfVbZlsBaCFZaszepbryrArS05PWmJSBQ6mta+v9iz0pUIAbW1eBILIg==", "dev": true }, "canonical-path": { @@ -3015,7 +2392,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -3025,20 +2401,17 @@ "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -3049,7 +2422,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, "requires": { "ansi-regex": "^5.0.0" } @@ -3145,12 +2517,12 @@ "integrity": "sha512-vyuYYRv3eXL0SCuZA4spRFlKNzQAewHcipRQCOKgRy7VNAvZxTKzbItdbCl4S5AgPZ5g3WkHp+ibWQwv9TLG7Q==" }, "codemirror-graphql": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/codemirror-graphql/-/codemirror-graphql-0.12.1.tgz", - "integrity": "sha512-PlOCTpfBBUwDZXQo60ZfzD/nGZsaJoE1tA07Uf9xJN7R0kBDGJeD4AVfdUTprZr27p0JIntJzmL6mt/G4Zkzeg==", + "version": "0.12.2-alpha.2", + "resolved": "https://registry.npmjs.org/codemirror-graphql/-/codemirror-graphql-0.12.2-alpha.2.tgz", + "integrity": "sha512-a1TwshsSr5MjOBXa2QUGiAH0PjtEVyrE8xk7XEl/NpdDod9ORXPPKt+CF05ONR4wlhYu1bh9lQDeKoA4jM2mqg==", "requires": { - "graphql-language-service-interface": "^2.4.1", - "graphql-language-service-parser": "^1.6.1" + "graphql-language-service-interface": "^2.4.2-alpha.2", + "graphql-language-service-parser": "^1.6.3" } }, "codemirror-spell-checker": { @@ -3361,6 +2733,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, "requires": { "safe-buffer": "~5.1.1" } @@ -3431,28 +2804,28 @@ } }, "copy-webpack-plugin": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.0.3.tgz", - "integrity": "sha512-q5m6Vz4elsuyVEIUXr7wJdIdePWTubsqVbEMvf1WQnHGv0Q+9yPRu7MtYFPt+GBOXRav9lvIINifTQ1vSCs+eA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.1.0.tgz", + "integrity": "sha512-aWjIuLt1OVQxaDVffnt3bnGmLA8zGgAJaFwPA+a+QYVPh1vhIKjVfh3SbOFLV0kRPvGBITbw17n5CsmiBS4LQQ==", "dev": true, "requires": { - "cacache": "^15.0.4", + "cacache": "^15.0.5", "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", + "p-limit": "^3.0.2", + "schema-utils": "^2.7.1", "serialize-javascript": "^4.0.0", "webpack-sources": "^1.4.3" }, "dependencies": { "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -3521,34 +2894,24 @@ } }, "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "dev": true, "requires": { - "@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" } }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", "dev": true, "requires": { "punycode": "^2.1.0" } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } } } }, @@ -3754,30 +3117,29 @@ } }, "css-loader": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.2.1.tgz", - "integrity": "sha512-MoqmF1if7Z0pZIEXA4ZF9PgtCXxWbfzfJM+3p+OYfhcrwcqhaCRb74DSnfzRl7e024xEiCRn5hCvfUbTf2sgFA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", + "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==", "dev": true, "requires": { "camelcase": "^6.0.0", "cssesc": "^3.0.0", "icss-utils": "^4.1.1", "loader-utils": "^2.0.0", - "normalize-path": "^3.0.0", "postcss": "^7.0.32", "postcss-modules-extract-imports": "^2.0.0", "postcss-modules-local-by-default": "^3.0.3", "postcss-modules-scope": "^2.2.0", "postcss-modules-values": "^3.0.0", "postcss-value-parser": "^4.1.0", - "schema-utils": "^2.7.0", + "schema-utils": "^2.7.1", "semver": "^7.3.2" }, "dependencies": { "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -3882,14 +3244,14 @@ "dev": true }, "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "dev": true, "requires": { - "@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" } }, "semver": { @@ -3908,9 +3270,9 @@ } }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -4097,9 +3459,10 @@ } }, "csstype": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.9.tgz", - "integrity": "sha512-xz39Sb4+OaTsULgUERcCk+TJj8ylkL4aSVDQiX/ksxbELSqwkgt4d4RD7fovIdgJGSuNYqwZEiVjYY5l0ask+Q==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", + "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==", + "dev": true }, "currently-unhandled": { "version": "0.4.1", @@ -4148,9 +3511,9 @@ } }, "date-fns": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.15.0.tgz", - "integrity": "sha512-ZCPzAMJZn3rNUvvQIMlXhDr4A+Ar07eLeGsGREoWU19a3Pqf5oYa+ccd+B3F6XVtQY6HANMFdOQ8A+ipFnvJdQ==" + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.16.1.tgz", + "integrity": "sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ==" }, "date-format": { "version": "3.0.0", @@ -4553,9 +3916,9 @@ }, "dependencies": { "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", + "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==", "dev": true } } @@ -4566,9 +3929,9 @@ "integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==" }, "domutils": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.2.0.tgz", - "integrity": "sha512-0haAxVr1PR0SqYwCH7mxMpHZUwjih9oPPedqpR/KufsnxPyZ9dyVw1R5093qnJF3WXSbjBkdzRWLw/knJV/fAg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.3.0.tgz", + "integrity": "sha512-xWC75PM3QF6MjE5e58OzwTX0B/rPQnlqH0YyXB/c056RtVJA+eu60da2I/bdnEHzEYC00g8QaZUlAbqOZVbOsw==", "dev": true, "requires": { "dom-serializer": "^1.0.1", @@ -4577,9 +3940,9 @@ }, "dependencies": { "dom-serializer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.0.1.tgz", - "integrity": "sha512-1Aj1Qy3YLbdslkI75QEOfdp9TkQ3o8LRISAzxOibjBs/xWwr1WxZFOQphFkZuepHFGo+kB8e5FVJSS0faAJ4Rw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.1.0.tgz", + "integrity": "sha512-ox7bvGXt2n+uLWtCRLybYx60IrOlWL/aCebWJk1T0d4m3y2tzf4U3ij9wBMUb6YJZpz06HCCYuyCDveE2xXmzQ==", "dev": true, "requires": { "domelementtype": "^2.0.1", @@ -4588,9 +3951,9 @@ } }, "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", + "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==", "dev": true } } @@ -4663,9 +4026,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.543", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.543.tgz", - "integrity": "sha512-PFbVI7G3e2fXSCFa+tgYAlyWNnUJZo4JtpJHYJ/DuB32opR6lzNJoH2LuR392Zr+nmw9jK5LZd+kvdcJDoj/fA==", + "version": "1.3.567", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.567.tgz", + "integrity": "sha512-1aKkw0Hha1Bw9JA5K5PT5eFXC/TXbkJvUfNSNEciPUMgSIsRJZM1hF2GUEAGZpAbgvd8En21EA+Lv820KOhvqA==", "dev": true }, "elliptic": { @@ -4694,8 +4057,7 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "emojis-list": { "version": "2.1.0", @@ -4860,6 +4222,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, "requires": { "is-arrayish": "^0.2.1" } @@ -5486,19 +4849,19 @@ } }, "file-loader": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz", - "integrity": "sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.0.tgz", + "integrity": "sha512-26qPdHyTsArQ6gU4P1HJbAbnFTyT2r0pG7czh1GFAd9TZbj0n94wWbupgixZH/ET/meqi2/5+F7DhW4OAXD+Lg==", "dev": true, "requires": { "loader-utils": "^2.0.0", - "schema-utils": "^2.6.5" + "schema-utils": "^2.7.1" }, "dependencies": { "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -5508,9 +4871,9 @@ } }, "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true }, "big.js": { @@ -5526,9 +4889,9 @@ "dev": true }, "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "json-schema-traverse": { @@ -5538,9 +4901,9 @@ "dev": true }, "json5": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", - "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -5557,26 +4920,21 @@ "json5": "^2.1.2" } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, "schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "dev": true, "requires": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" } }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -5625,16 +4983,10 @@ "pkg-dir": "^4.1.0" } }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -6193,31 +5545,21 @@ "dev": true }, "graphiql": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/graphiql/-/graphiql-1.0.3.tgz", - "integrity": "sha512-6YW76m2exdpGiVS75I0QsbM4NanvenKFR9FtW/IFbui0mWv89iVa1FbdjhUt+kxa+LX/WlqTshiqiZRz7E5Bgg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/graphiql/-/graphiql-1.0.4.tgz", + "integrity": "sha512-y6y64ICXaNlAAGqqruTYFp4L0BU82ixZ5PzUZZvHC4bLZfoDujBCABTRkTL5vG5JM3WVTZKc2OA7zdqEFM+dgQ==", "requires": { - "@emotion/core": "^10.0.28", - "@mdx-js/react": "^1.5.2", - "codemirror": "^5.52.2", - "codemirror-graphql": "^0.12.0", + "codemirror": "^5.54.0", + "codemirror-graphql": "^0.12.2-alpha.2", "copy-to-clipboard": "^3.2.0", "entities": "^2.0.0", - "markdown-it": "^10.0.0", - "monaco-graphql": "^0.2.0", - "regenerator-runtime": "^0.13.5", - "theme-ui": "^0.3.1" + "markdown-it": "^10.0.0" }, "dependencies": { "codemirror": { "version": "5.57.0", "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.57.0.tgz", "integrity": "sha512-WGc6UL7Hqt+8a6ZAsj/f1ApQl3NPvHY/UQSzG6fB6l4BjExgVdhFaxd7mRTw1UCiYe/6q86zHP+kfvBQcZGvUg==" - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, @@ -6226,42 +5568,44 @@ "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.3.0.tgz", "integrity": "sha512-GTCJtzJmkFLWRfFJuoo9RWWa/FfamUHgiFosxi/X1Ani4AVWbeyBenZTNX6dM+7WSbbFfTo/25eh0LLkwHMw2w==" }, - "graphql-language-service": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/graphql-language-service/-/graphql-language-service-3.0.1.tgz", - "integrity": "sha512-79EGvEECgn1HIX0VBh3pXqetqgdtRHfkNTws0mcirCtFowwqt+QZAKKBNKVLY2vMya9wNVLDWUvzl0FF5wbBTA==", - "requires": { - "graphql-language-service-interface": "^2.4.1", - "graphql-language-service-types": "^1.6.1" - } - }, "graphql-language-service-interface": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/graphql-language-service-interface/-/graphql-language-service-interface-2.4.1.tgz", - "integrity": "sha512-cKT0ia7xNVpkLlI0vuwxVpPVIXwy02ah4I+N6s4mxFKVgo+lPlX9r933EWX6t1P1vzGJmNf+dip2dK3gHg2bBw==", + "version": "2.4.2-alpha.2", + "resolved": "https://registry.npmjs.org/graphql-language-service-interface/-/graphql-language-service-interface-2.4.2-alpha.2.tgz", + "integrity": "sha512-NDFMOqSUXW7RK+NJ0Sup525YQHbr4H7rCtTNJmMYll4gLazLr7HiePd6ONovwmS/T8sFAw9DDOCTHmlKr1IOaA==", "requires": { - "graphql-language-service-parser": "^1.6.1", - "graphql-language-service-types": "^1.6.1", - "graphql-language-service-utils": "^2.4.1", + "graphql-language-service-parser": "^1.6.3", + "graphql-language-service-types": "^1.6.2", + "graphql-language-service-utils": "^2.4.2", "vscode-languageserver-types": "^3.15.1" } }, "graphql-language-service-parser": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/graphql-language-service-parser/-/graphql-language-service-parser-1.6.2.tgz", - "integrity": "sha512-7CwFkvuOjyrzwk+Ox4hPH839NOGnFHbzlWD08nsRxRTqth71LkHWS1ADVFxvBv49C1kXFmLSsCMhi4PH1meozQ==" + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/graphql-language-service-parser/-/graphql-language-service-parser-1.6.3.tgz", + "integrity": "sha512-UjmVXcSN59pCkFDBIZav0rTdz7ISeYAgGshA/0OpFlrJ6ZkS3hlOBbu/QvLyjRvTcjKpx95qT299auL39kE+/g==", + "requires": { + "graphql-language-service-types": "^1.6.2", + "typescript": "^3.9.5" + }, + "dependencies": { + "typescript": { + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==" + } + } }, "graphql-language-service-types": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/graphql-language-service-types/-/graphql-language-service-types-1.6.1.tgz", - "integrity": "sha512-ag3m5b7aje7ZBSuLVQE/gt2iDL9WEfzotZfLyskUDOonhHKniQ8BfmSQ/pF9F6zrdVjtZ8VRr5nes1sEYvvwKQ==" + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/graphql-language-service-types/-/graphql-language-service-types-1.6.2.tgz", + "integrity": "sha512-5cslPoUd8P7/EjJ5L3/zs0NBeDhvQHhjUMbjKQakwqu4tZXplriZ9KvvA+Q/n4w/Rn79+3cbr7maNtsTk6/TmQ==" }, "graphql-language-service-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/graphql-language-service-utils/-/graphql-language-service-utils-2.4.1.tgz", - "integrity": "sha512-fqYSrjJ3YXHwY9eYUz5nesLwLfo8csbR/hS4Xz8wDZCeqkD20UzjVfnbF1Q0SjtKFlDtEfnG9hJvHZEJXZCF3A==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/graphql-language-service-utils/-/graphql-language-service-utils-2.4.2.tgz", + "integrity": "sha512-el9WfW0LyKaxpUzsIOec/qAjSdXIQ6hVRAX2HV8bN0+yPO93m6sMfPDtNrVkj/2FkwtruCrs01TB0dB1Qk9Dew==", "requires": { - "graphql-language-service-types": "^1.6.1" + "graphql-language-service-types": "^1.6.2" } }, "gzip-size": { @@ -6582,9 +5926,9 @@ "dev": true }, "html-loader": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-1.2.1.tgz", - "integrity": "sha512-oE92tLmSnWIjM0190s8+MiwNAKValkddHSVphSR37MrwcP3iy/rbbw4N7hSLG+m3OiuVRwVHJYFcIYfN2xqUHQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-1.3.0.tgz", + "integrity": "sha512-c4ROd3YokzLWj6YUfI/NcqAsZI8ULtKfkE/8W862vxd2fMst4SVIQt+RVMNUnNmnz0p4uz7Wqc7PXZOdm5KAXA==", "dev": true, "requires": { "html-minifier-terser": "^5.1.1", @@ -6594,9 +5938,9 @@ }, "dependencies": { "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -6656,20 +6000,20 @@ } }, "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" } }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -6701,9 +6045,9 @@ } }, "html-webpack-plugin": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.3.0.tgz", - "integrity": "sha512-C0fzKN8yQoVLTelcJxZfJCE+aAvQiY2VUf3UuKrR4a9k5UMWYOtpDLsaXwATbcVCnI05hUS7L9ULQHWLZhyi3w==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.4.1.tgz", + "integrity": "sha512-nEtdEIsIGXdXGG7MjTTZlmhqhpHU9pJFc1OYxcP36c5/ZKP6b0BJMww2QTvJGQYA9aMxUnjDujpZdYcVOXiBCQ==", "dev": true, "requires": { "@types/html-minifier-terser": "^5.0.0", @@ -6770,9 +6114,9 @@ }, "dependencies": { "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", + "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==", "dev": true } } @@ -6994,15 +6338,6 @@ "resolved": "https://registry.npmjs.org/image-focus/-/image-focus-1.1.2.tgz", "integrity": "sha512-QhWV2s/OqLNplZMJZvT21zyjTKM6dQDY5xaPNyDENr62HGPOZWkiceOdafWogodWNAIKNjhVsnjUHQhf0JlIww==" }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "requires": { - "import-from": "^2.1.0" - } - }, "import-fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", @@ -7030,23 +6365,6 @@ } } }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -7295,7 +6613,8 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true }, "is-binary-path": { "version": "2.1.0", @@ -7801,9 +7120,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -7838,6 +7157,11 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -7845,9 +7169,10 @@ "dev": true }, "json-parse-even-better-errors": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.0.tgz", - "integrity": "sha512-o3aP+RsWDJZayj1SbHNQAI8x0v3T3SKiGoZlNYfbUP1S3omJQ6i9CnqADqkSPaOAxwua4/1YWx5CM7oiChJt2Q==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true }, "json-schema": { "version": "0.2.3", @@ -7922,24 +7247,23 @@ } }, "karma": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-5.1.1.tgz", - "integrity": "sha512-xAlOr5PMqUbiKXSv5PCniHWV3aiwj6wIZ0gUVcwpTCPVQm/qH2WAMFWxtnpM6KJqhkRWrIpovR4Rb0rn8GtJzQ==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/karma/-/karma-5.2.2.tgz", + "integrity": "sha512-rB3Ua5yDxmIupTj67r3Q8itz7TxJzRE6DmVcOfV20D509Uu9AoBKlVwbZhND4kcm6BqLfbHtv4DZC9QJfrUY+w==", "dev": true, "requires": { "body-parser": "^1.19.0", "braces": "^3.0.2", - "chokidar": "^3.0.0", + "chokidar": "^3.4.2", "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", + "lodash": "^4.17.19", "log4js": "^6.2.1", "mime": "^2.4.5", "minimatch": "^3.0.4", @@ -8204,9 +7528,9 @@ "dev": true }, "klona": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/klona/-/klona-1.1.2.tgz", - "integrity": "sha512-xf88rTeHiXk+XE2Vhi6yj8Wm3gMZrygGdKjJqN8HkV+PwF/t50/LdAKHoHpPcxFAlmQszTZ1CugrK25S7qDRLA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.3.tgz", + "integrity": "sha512-CgPOT3ZadDpXxKcfV56lEQ9OQSZ42Mk26gnozI+uN/k39vzD8toUhRQoqsX0m9Q3eMPEfsLWmtyUpK/yqST4yg==", "dev": true }, "known-css-properties": { @@ -8238,7 +7562,8 @@ "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true }, "linkify-it": { "version": "2.2.0", @@ -8282,7 +7607,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, "requires": { "p-locate": "^4.1.0" } @@ -8636,9 +7960,9 @@ } }, "mini-css-extract-plugin": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.10.0.tgz", - "integrity": "sha512-QgKgJBjaJhxVPwrLNqqwNS0AGkuQQ31Hp4xGXEK/P7wehEg6qmNtReHKai3zRXqY60wGVWLYcOMJK2b98aGc3A==", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.2.tgz", + "integrity": "sha512-h2LknfX4U1kScXxH8xE9LCOqT5B+068EAj36qicMb8l4dqdJoyHcmWmpd+ueyZfgu/POvIn+teoUnTtei2ikug==", "dev": true, "requires": { "loader-utils": "^1.1.0", @@ -8670,8 +7994,7 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minipass": { "version": "3.1.3", @@ -8780,21 +8103,6 @@ "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" }, - "monaco-editor": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.20.0.tgz", - "integrity": "sha512-hkvf4EtPJRMQlPC3UbMoRs0vTAFAYdzFQ+gpMb8A+9znae1c43q8Mab9iVsgTcg/4PNiLGGn3SlDIa8uvK1FIQ==" - }, - "monaco-graphql": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/monaco-graphql/-/monaco-graphql-0.2.0.tgz", - "integrity": "sha512-IwpbJvrNlFxq6xjnQQ8eC72ep+q2vfiUaHBNkfqe314CXYnUCcXYfoMBfR5EuLAXRBOTf4CKl6BCN1/9eHrq7A==", - "requires": { - "graphql-language-service": "^3.0.0", - "graphql-language-service-utils": "^2.4.0", - "monaco-editor": "^0.20.0" - } - }, "mousetrap": { "version": "1.6.5", "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz", @@ -9061,9 +8369,9 @@ } }, "node-releases": { - "version": "1.1.60", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", - "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==", + "version": "1.1.61", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz", + "integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==", "dev": true }, "node-sass": { @@ -9475,9 +8783,9 @@ } }, "optimize-css-assets-webpack-plugin": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", - "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", "dev": true, "requires": { "cssnano": "^4.1.10", @@ -9553,7 +8861,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, "requires": { "p-limit": "^2.2.0" } @@ -9620,6 +8927,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, "requires": { "callsites": "^3.0.0" }, @@ -9627,7 +8935,8 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true } } }, @@ -9728,8 +9037,7 @@ "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, "path-is-absolute": { "version": "1.0.1", @@ -10295,26 +9603,148 @@ "postcss-values-parser": "^2.0.0" } }, - "postcss-load-config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", - "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - } - }, "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.0.1.tgz", + "integrity": "sha512-m+2fe21cs/1Oz4Yds90al5uqVSc0yJRhYSfCRnsnVLt3z0QoNPpqLdgW7CGVWmlUlKEGL9vmq+P4hHS6Orb5DA==", "dev": true, "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" + "cosmiconfig": "^7.0.0", + "klona": "^2.0.3", + "loader-utils": "^2.0.0", + "schema-utils": "^2.7.1", + "semver": "^7.3.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", + "dev": true, + "requires": { + "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-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "requires": { + "@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" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + } } }, "postcss-logical": { @@ -11896,9 +11326,9 @@ "dev": true }, "rxjs": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", - "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", "requires": { "tslib": "^1.9.0" }, @@ -12236,22 +11666,22 @@ } }, "sass-loader": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-9.0.3.tgz", - "integrity": "sha512-fOwsP98ac1VMme+V3+o0HaaMHp8Q/C9P+MUazLFVi3Jl7ORGHQXL1XeRZt3zLSGZQQPC8xE42Y2WptItvGjDQg==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.0.2.tgz", + "integrity": "sha512-wV6NDUVB8/iEYMalV/+139+vl2LaRFlZGEd5/xmdcdzQcgmis+npyco6NsDTVOlNA3y2NV9Gcz+vHyFMIT+ffg==", "dev": true, "requires": { - "klona": "^1.1.2", + "klona": "^2.0.3", "loader-utils": "^2.0.0", "neo-async": "^2.6.2", - "schema-utils": "^2.7.0", + "schema-utils": "^2.7.1", "semver": "^7.3.2" }, "dependencies": { "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -12311,14 +11741,14 @@ } }, "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "dev": true, "requires": { - "@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" } }, "semver": { @@ -12328,9 +11758,9 @@ "dev": true }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -13604,26 +13034,6 @@ } } }, - "styled-system": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/styled-system/-/styled-system-5.1.5.tgz", - "integrity": "sha512-7VoD0o2R3RKzOzPK0jYrVnS8iJdfkKsQJNiLRDjikOpQVqQHns/DXWaPZOH4tIKkhAT7I6wIsy9FWTWh2X3q+A==", - "requires": { - "@styled-system/background": "^5.1.2", - "@styled-system/border": "^5.1.5", - "@styled-system/color": "^5.1.2", - "@styled-system/core": "^5.1.2", - "@styled-system/flexbox": "^5.1.2", - "@styled-system/grid": "^5.1.2", - "@styled-system/layout": "^5.1.2", - "@styled-system/position": "^5.1.2", - "@styled-system/shadow": "^5.1.2", - "@styled-system/space": "^5.1.2", - "@styled-system/typography": "^5.1.2", - "@styled-system/variant": "^5.1.5", - "object-assign": "^4.1.1" - } - }, "stylehacks": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", @@ -13840,26 +13250,26 @@ } }, "terser-webpack-plugin": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.1.0.tgz", - "integrity": "sha512-0ZWDPIP8BtEDZdChbufcXUigOYk6dOX/P/X0hWxqDDcVAQLb8Yy/0FAaemSfax3PAA67+DJR778oz8qVbmy4hA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.0.tgz", + "integrity": "sha512-Wi0YFbWKG8gBXhbJmrMusRcoXl/C9U5BzIPC2Tn3Si0hejGhhIh0gPf9rEfOCxwigzRPLC8PXv42qDiRTocMXg==", "dev": true, "requires": { "cacache": "^15.0.5", "find-cache-dir": "^3.3.1", "jest-worker": "^26.3.0", "p-limit": "^3.0.2", - "schema-utils": "^2.6.6", + "schema-utils": "^2.7.1", "serialize-javascript": "^4.0.0", "source-map": "^0.6.1", - "terser": "^5.0.0", + "terser": "^5.3.0", "webpack-sources": "^1.4.3" }, "dependencies": { "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -13902,20 +13312,20 @@ } }, "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "dev": true, "requires": { - "@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" } }, "terser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.2.1.tgz", - "integrity": "sha512-/AOtjRtAMNGO0fIF6m8HfcvXTw/2AKpsOzDn36tA5RfhRdeXyb4RvHxJ5Pah7iL6dFkLk+gOnCaNHGwJPl6TrQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.1.tgz", + "integrity": "sha512-yD80f4hdwCWTH5mojzxe1q8bN1oJbsK/vfJGLcPZM/fl+/jItIVNKhFIHqqR71OipFWMLgj3Kc+GIp6CeIqfnA==", "dev": true, "requires": { "commander": "^2.20.0", @@ -13924,23 +13334,13 @@ } }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", "dev": true, "requires": { "punycode": "^2.1.0" } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } } } }, @@ -13950,19 +13350,6 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "theme-ui": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/theme-ui/-/theme-ui-0.3.1.tgz", - "integrity": "sha512-My/TSALqp7Dst5Ez7nJA+94Q8zJhc26Z0qGo8kEWyoqHHJ5TU8xdhjLPBltTdQck3T32cSq5USIeSKU3JtxYUQ==", - "requires": { - "@theme-ui/color-modes": "^0.3.1", - "@theme-ui/components": "^0.3.1", - "@theme-ui/core": "^0.3.1", - "@theme-ui/css": "^0.3.1", - "@theme-ui/mdx": "^0.3.0", - "@theme-ui/theme-provider": "^0.3.1" - } - }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -14122,9 +13509,9 @@ "dev": true }, "ts-loader": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.2.tgz", - "integrity": "sha512-oYT7wOTUawYXQ8XIDsRhziyW0KUEV38jISYlE+9adP6tDtG+O5GkRe4QKQXrHVH4mJJ88DysvEtvGP65wMLlhg==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.3.tgz", + "integrity": "sha512-wsqfnVdB7xQiqhqbz2ZPLGHLPZbHVV5Qn/MNFZkCFxRU1miDyxKORucDGxKtsQJ63Rfza0udiUxWF5nHY6bpdQ==", "dev": true, "requires": { "chalk": "^2.3.0", @@ -14342,9 +13729,9 @@ } }, "typescript": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", - "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", "dev": true }, "typo-js": { @@ -14364,9 +13751,9 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, "underscore": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.10.2.tgz", - "integrity": "sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.11.0.tgz", + "integrity": "sha512-xY96SsN3NA461qIRKZ/+qox37YXPtSBswMGfiNptr+wrt6ds4HaMw23TP612fEyGekRE6LNRiLYr/aqbHXNedw==", "dev": true }, "union-value": { @@ -14620,9 +14007,9 @@ "integrity": "sha512-qKpyAQ9UMT0QygLbCulgabKkgfo8aVkuWSqhvEiaah/iy/Dvj17iMFChUU+UIioorWlweXcp5ziXoMLIl7hTAg==" }, "vis-network": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vis-network/-/vis-network-8.2.0.tgz", - "integrity": "sha512-2fnI4jINbluGT0MmZoIk0XkYLRFPvEbTbhP0A1xUYhbUiO28ARhlIMfR3Z3I4eaEo/E0lGVZYWH+2DWyohG0tw==" + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/vis-network/-/vis-network-8.3.2.tgz", + "integrity": "sha512-vJDctP2gZzZbpgpB+MJxNudsqRGdkRablwdLOWd6yZKZQuEBZltOJSBaSCsyQVMD1gY8mjuYhNRoIcy7g+PDvQ==" }, "vis-util": { "version": "4.3.4", @@ -16092,9 +15479,9 @@ } }, "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "dev": true, "requires": { "source-list-map": "^2.0.0", @@ -16158,7 +15545,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -16168,14 +15554,12 @@ "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "ansi-styles": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, "requires": { "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" @@ -16185,7 +15569,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -16193,20 +15576,17 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -16217,7 +15597,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, "requires": { "ansi-regex": "^5.0.0" } @@ -16281,13 +15660,13 @@ "yaml": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==" + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true }, "yargs": { "version": "15.3.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz", "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==", - "dev": true, "requires": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -16305,20 +15684,17 @@ "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -16329,7 +15705,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, "requires": { "ansi-regex": "^5.0.0" } @@ -16340,7 +15715,6 @@ "version": "18.1.3", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" diff --git a/frontend/package.json b/frontend/package.json index b30d9e021..3c270a27b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -17,31 +17,29 @@ "postinstall": "ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points" }, "dependencies": { - "@angular/animations": "10.0.11", - "@angular/cdk": "10.1.3", - "@angular/common": "10.0.11", - "@angular/core": "10.0.11", - "@angular/forms": "10.0.11", - "@angular/localize": "10.0.11", - "@angular/platform-browser": "10.0.11", - "@angular/platform-browser-dynamic": "10.0.11", - "@angular/platform-server": "10.0.11", - "@angular/router": "10.0.11", + "@angular/animations": "10.1.1", + "@angular/cdk": "10.2.0", + "@angular/common": "10.1.1", + "@angular/core": "10.1.1", + "@angular/forms": "10.1.1", + "@angular/localize": "10.1.1", + "@angular/platform-browser": "10.1.1", + "@angular/platform-browser-dynamic": "10.1.1", + "@angular/platform-server": "10.1.1", + "@angular/router": "10.1.1", "@egjs/hammerjs": "2.0.17", - "@ngx-translate/core": "13.0.0", - "@ngx-translate/http-loader": "6.0.0", - "@types/codemirror": "0.0.97", + "@types/codemirror": "0.0.98", "ace-builds": "1.4.12", - "angular-gridster2": "10.1.4", + "angular-gridster2": "10.1.5", "angular-mentions": "1.2.0", "angular2-chartjs": "0.5.1", "babel-polyfill": "6.26.0", "bootstrap": "4.5.2", "core-js": "3.6.5", "cropperjs": "2.0.0-alpha.1", - "date-fns": "2.15.0", + "date-fns": "2.16.1", "font-awesome": "4.7.0", - "graphiql": "1.0.3", + "graphiql": "1.0.4", "graphql": "15.3.0", "image-focus": "1.1.2", "keycharm": "0.3.1", @@ -54,46 +52,46 @@ "progressbar.js": "1.1.0", "react": "16.13.1", "react-dom": "16.13.1", - "rxjs": "6.6.2", + "rxjs": "6.6.3", "simplemde": "1.11.2", "slugify": "1.4.5", "tinymce": "5.4.2", "tslib": "2.0.1", "vis-data": "7.0.0", - "vis-network": "8.2.0", + "vis-network": "8.3.2", "vis-util": "4.3.4", "zone.js": "0.11.1" }, "devDependencies": { - "@angular-devkit/build-optimizer": "0.1000.7", - "@angular/compiler": "10.0.11", - "@angular/compiler-cli": "10.0.11", - "@ngtools/webpack": "10.0.7", - "@types/core-js": "2.5.3", - "@types/jasmine": "3.5.13", + "@angular-devkit/build-optimizer": "0.1001.1", + "@angular/compiler": "10.1.1", + "@angular/compiler-cli": "10.1.1", + "@ngtools/webpack": "10.1.1", + "@types/core-js": "2.5.4", + "@types/jasmine": "3.5.14", "@types/marked": "1.1.0", "@types/mersenne-twister": "1.1.2", "@types/mousetrap": "^1.6.3", - "@types/node": "14.6.0", - "@types/react": "16.9.46", + "@types/node": "14.10.1", + "@types/react": "16.9.49", "@types/react-dom": "16.9.8", "@types/simplemde": "1.11.7", "@types/tinymce": "4.5.24", - "browserslist": "4.14.0", - "caniuse-lite": "1.0.30001117", + "browserslist": "4.14.2", + "caniuse-lite": "1.0.30001129", "circular-dependency-plugin": "5.2.0", "codelyzer": "6.0.0", - "copy-webpack-plugin": "6.0.3", - "css-loader": "4.2.1", + "copy-webpack-plugin": "6.1.0", + "css-loader": "4.3.0", "cssnano": "4.1.10", "entities": "2.0.3", - "file-loader": "6.0.0", - "html-loader": "1.2.1", - "html-webpack-plugin": "4.3.0", + "file-loader": "6.1.0", + "html-loader": "1.3.0", + "html-webpack-plugin": "4.4.1", "ignore-loader": "0.1.2", "istanbul-instrumenter-loader": "3.0.1", "jasmine-core": "3.6.0", - "karma": "5.1.1", + "karma": "5.2.2", "karma-chrome-launcher": "3.1.0", "karma-cli": "2.0.0", "karma-coverage-istanbul-reporter": "3.0.3", @@ -103,11 +101,11 @@ "karma-mocha-reporter": "2.2.5", "karma-sourcemap-loader": "0.3.8", "karma-webpack": "4.0.2", - "mini-css-extract-plugin": "0.10.0", + "mini-css-extract-plugin": "0.11.2", "node-sass": "4.14.1", - "optimize-css-assets-webpack-plugin": "5.0.3", + "optimize-css-assets-webpack-plugin": "5.0.4", "postcss-import": "12.0.1", - "postcss-loader": "3.0.0", + "postcss-loader": "4.0.1", "postcss-preset-env": "6.7.0", "raw-loader": "4.0.1", "resize-observer-polyfill": "1.5.1", @@ -115,18 +113,18 @@ "rxjs-tslint": "0.1.8", "sass-lint": "1.13.1", "sass-lint-webpack": "1.0.3", - "sass-loader": "9.0.3", + "sass-loader": "10.0.2", "style-loader": "1.2.1", "sugarss": "2.0.0", - "terser-webpack-plugin": "4.1.0", - "ts-loader": "8.0.2", + "terser-webpack-plugin": "4.2.0", + "ts-loader": "8.0.3", "tsconfig-paths-webpack-plugin": "3.3.0", "tslint": "6.1.3", "tslint-immutable": "6.0.1", "tslint-webpack-plugin": "2.1.0", "typemoq": "2.1.0", - "typescript": "3.9", - "underscore": "1.10.2", + "typescript": "4.0", + "underscore": "1.11.0", "webpack": "4.44.1", "webpack-bundle-analyzer": "3.8.0", "webpack-cli": "3.3.12", diff --git a/frontend/tsconfig.spec.json b/frontend/tsconfig.spec.json index 79a487613..2cbe06a96 100644 --- a/frontend/tsconfig.spec.json +++ b/frontend/tsconfig.spec.json @@ -1,5 +1,8 @@ { "extends": "./tsconfig.json", + "compilerOptions": { + "types": ["node", "jasmine"] + }, "include": [ "app/**/*.d.ts", "app/**/*.spec.ts" From 45e2537f8def710a869f2441a19d83010b852165 Mon Sep 17 00:00:00 2001 From: fpisu-sardit <70273645+fpisu-sardit@users.noreply.github.com> Date: Tue, 15 Sep 2020 18:31:04 +0200 Subject: [PATCH 11/21] add italian translation (#574) * add italian translation --- backend/i18n/frontend_it.json | 124 +++++++++++------------ backend/i18n/source/backend_it.json | 71 +++++++++---- backend/i18n/source/frontend_it.json | 89 +++++++++++----- backend/i18n/translate.bat | 9 +- backend/src/Squidex.Shared/Texts.it.resx | 104 +++++++++---------- 5 files changed, 236 insertions(+), 161 deletions(-) diff --git a/backend/i18n/frontend_it.json b/backend/i18n/frontend_it.json index 606dd164a..a27b7c9e1 100644 --- a/backend/i18n/frontend_it.json +++ b/backend/i18n/frontend_it.json @@ -10,8 +10,8 @@ "apps.appNameHint": "Puoi utilizzare solo lettere, numeri e trattini e non più di 40 caratteri.", "apps.appNameValidationMessage": "Il nome può contenere lettere minuscole (a-z), numeri e trattini all'interno.", "apps.appNameWarning": "Il nome della app non potrà essere cambiato in un secondo momento.", - "apps.appsButtonCreate": "Panoramica delle App", - "apps.appsButtonFallbackTitle": "Panoramica delle App", + "apps.appsButtonCreate": "Nuova App", + "apps.appsButtonFallbackTitle": "Lista App", "apps.archieve": "Archivia l'App", "apps.archieveConfirmText": "Rimuovi il pattern", "apps.archieveConfirmTitle": "Sei sicuro di voler archiviare questa app?", @@ -20,14 +20,14 @@ "apps.create": "Crea un'App", "apps.createBlankApp": "Nuova App.", "apps.createBlankAppDescription": "Crea una app vuota senza contenuti o schema.", - "apps.createBlogApp": "Nuovo esempio di blog", + "apps.createBlogApp": "Nuovo blog", "apps.createBlogAppDescription": "Inizia con il nostro blog già pronto per l'uso.", "apps.createFailed": "Non è stato possibile creare l'app. Per favore ricarica.", - "apps.createIdentityApp": "New Identity App", + "apps.createIdentityApp": "Nuova Identity App", "apps.createIdentityAppDescription": "Crea un app per Squidex Identity.", "apps.createIdentityAppV2": "Nuova Identity App V2", "apps.createIdentityAppV2Description": "Creare un app per Squidex Identity V2.", - "apps.createProfileApp": "Nuovo esempio di Profilo", + "apps.createProfileApp": "Nuovo Profilo", "apps.createProfileAppDescription": "Crea la tua pagina del profilo.", "apps.createWithTemplate": "Create un esempio di {template}", "apps.empty": "Non stai ancora collaborando su nessuna app", @@ -81,8 +81,8 @@ "assets.protected": "Protetto", "assets.refreshTooltip": "Aggiorna le risorse (CTRL + SHIFT + R)", "assets.reloaded": "Risorse ricaricate.", - "assets.removeConfirmText": "Do you really want to remove the asset?", - "assets.removeConfirmTitle": "Remove asset", + "assets.removeConfirmText": "Sei sicuro di voler cancellare la risorsa?", + "assets.removeConfirmTitle": "Risorsa cancellata", "assets.renameFolder": "Rinomina la cartella", "assets.replaceConfirmText": "Sei sicuro di voler sostituire la risorsa con una nuova versione?", "assets.replaceConfirmTitle": "Sostituisco la risorsa?", @@ -90,8 +90,8 @@ "assets.searchByName": "Ricerca per nome", "assets.searchByTags": "Ricerca per tag", "assets.selectMany": "Seleziona le risorse", - "assets.specialFolder.parent": "", - "assets.specialFolder.root": "Assets", + "assets.specialFolder.parent": "", + "assets.specialFolder.root": "Risorse", "assets.tabFocusPoint": "Punto focale", "assets.tabHistory": "Cronologia", "assets.tabImage": "Immagine", @@ -138,8 +138,8 @@ "clients.addFailed": "Non è stato possibile aggiungere un client. Per favore ricarica.", "clients.allowAnonymous": "Consenti l'accesso anonimo.", "clients.allowAnonymousHint": "Consenti l'accesso alle API senza token di accesso a tutte le risorse che sono configurate per il ruolo di questo client. E' possibile avere un solo client impostato con accesso anonimo.", - "clients.apiCallsLimit": "Max API Calls", - "clients.apiCallsLimitHint": "Limit the number of API calls this client can make per month to protect your API contingent for other clients that are more important.", + "clients.apiCallsLimit": "Numero Max di chiamate alle API", + "clients.apiCallsLimitHint": "Limita il numero di chiamate al mese effettuabili dal client alle API calls per riservare ai client più importanti il numero di chiamate API disponili.", "clients.clientIdValidationMessage": "Il nome deve contenere solo lettere, numeri, trattini e spaziNa.", "clients.clientNamePlaceholder": "Inserisci il nome del client", "clients.connect": "Connettere", @@ -203,19 +203,19 @@ "common.clientSecret": "Secret Client", "common.clipboardAdded": "Il valore è stato aggiunto nei tuoi appunti.", "common.clone": "Clona", - "common.cluster": "Raggruppamento", - "common.clusterPageTitle": "Raggruppamento", + "common.cluster": "Cluster", + "common.clusterPageTitle": "Cluster", "common.comments": "Commenti", "common.confirm": "Conferma", - "common.consumers": "Utenti", - "common.content": "Contentenuto", - "common.contents": "Contentenuti", + "common.consumers": "Servizi", + "common.content": "Contenuto", + "common.contents": "Contenuti", "common.continue": "Continua", "common.contributors": "Collaboratori", "common.create": "Crea", "common.created": "Creato", "common.date": "Data", - "common.dateTimeEditor.local": "Local", + "common.dateTimeEditor.local": "Locale", "common.dateTimeEditor.now": "Data e Ora attuale", "common.dateTimeEditor.nowTooltip": "Imposta la data e l'ora attuale (UTC)", "common.dateTimeEditor.today": "Oggi", @@ -275,16 +275,16 @@ "common.preview": "Anteprima", "common.product": "Squidex Headless CMS", "common.project": "Progetto", - "common.queryOperators.contains": "contains", - "common.queryOperators.empty": "is empty", - "common.queryOperators.endsWith": "ends with", - "common.queryOperators.eq": "is equals to", - "common.queryOperators.ge": "is greater than or equals to", - "common.queryOperators.gt": "is greater than", - "common.queryOperators.le": "is less than pr equals to", - "common.queryOperators.lt": "is less than", - "common.queryOperators.ne": "is not equals to", - "common.queryOperators.startsWith": "starts with", + "common.queryOperators.contains": "contiene", + "common.queryOperators.empty": "è vuoto", + "common.queryOperators.endsWith": "finisce con", + "common.queryOperators.eq": "è uguale a", + "common.queryOperators.ge": "è maggiore di o uguale a", + "common.queryOperators.gt": "è maggiore di", + "common.queryOperators.le": "è minore di o uguale a", + "common.queryOperators.lt": "è minore di", + "common.queryOperators.ne": "è uguale a", + "common.queryOperators.startsWith": "inizia con", "common.refresh": "Aggiorna", "common.rename": "Rinomina", "common.requiredHint": "obbligatorio", @@ -359,19 +359,19 @@ "contents.draftStatus": "Nuova versione", "contents.editPageTitle": "Modifica contenuto", "contents.editTitle": "Modifica il contenuto", - "contents.invariantFieldDescription": "The '{fieldName}' field of the content item.", + "contents.invariantFieldDescription": "Il campo '{fieldName}' del contenuto.", "contents.languageModeAll": "Tutte le lingue", "contents.languageModeSingle": "Una sola lingua", - "contents.lastModifiedByFieldDescription": "L'utente che ha modificato l'elememto l'ultima voltaThe user who modified the content item the last time.", + "contents.lastModifiedByFieldDescription": "L'utente che ha modificato l'elemento l'ultima volta.", "contents.lastModifiedFieldDescription": "La data e l'ora dell'ultima modifica del contenuto.", "contents.lastUpdatedLabel": "Ultimo aggiornamento", "contents.loadContent": "Carica", "contents.loadContentFailed": "Non è stato possibile caricare il contenuto. Per favore ricarica.", "contents.loadDataFailed": "Non è stato possibile caricare i dati. Per favore ricarica.", "contents.loadFailed": "Non è stato possibile caricare i contenuti. Per favore ricarica.", - "contents.loadVersionFailed": "Non è stato possibile version a new version. Per favore ricarica.", - "contents.localizedFieldDescription": "The '{fieldName}' field of the content item (localized).", - "contents.newStatusFieldDescription": "The new status of the content item.", + "contents.loadVersionFailed": "Non è stato possibile creare una nuova versione. Per favore ricarica.", + "contents.localizedFieldDescription": "Il campo '{fieldName}' del contenuto (localizzato).", + "contents.newStatusFieldDescription": "Nuovo stato per l'elemento del contenuto.", "contents.noReference": "- Nessun collegamento -", "contents.pendingChangesTextToChange": "Non hai salvato le modifiche.\n\nSe cambi lo stato perderai le modifiche.\n\n**Sei sicuro di voler continuare?**", "contents.pendingChangesTextToClose": "Non hai salvato le modifiche.\n\nChiudendo il contenuto corrente perderai tutte le modifiche.\n\n**Sei sicuro di voler continuare?**", @@ -383,8 +383,8 @@ "contents.referencesSelectSchema": "Seleziona {schema}", "contents.refreshTooltip": "Aggiorna i contenuti (CTRL + SHIFT + R)", "contents.reloaded": "Contenuti aggiornati.", - "contents.removeConfirmText": "Do you really want to remove the content?", - "contents.removeConfirmTitle": "Remove content", + "contents.removeConfirmText": "Sei sicuro di voler rimuovere il contenuto?", + "contents.removeConfirmTitle": "Cancella il contenuto", "contents.saveAndPublish": "Salva e pubblica", "contents.scheduledAt": "alle", "contents.scheduledAtLabel": "alle", @@ -397,16 +397,16 @@ "contents.statusQueries": "Stato Query", "contents.stockPhotoEmpty": "Nessuna selezione", "contents.stockPhotoSearch": "Cerca foto su Unsplash", - "contents.tableHeaders.created": "Created", - "contents.tableHeaders.createdBy": "Created By", - "contents.tableHeaders.createdByShort": "By", + "contents.tableHeaders.created": "Creato", + "contents.tableHeaders.createdBy": "Creato da", + "contents.tableHeaders.createdByShort": "Da", "contents.tableHeaders.id": "Id", - "contents.tableHeaders.lastModified": "Updated", - "contents.tableHeaders.lastModifiedBy": "Updated By", - "contents.tableHeaders.lastModifiedByShort": "By", - "contents.tableHeaders.nextStatus": "Next Status", - "contents.tableHeaders.status": "Status", - "contents.tableHeaders.version": "Version", + "contents.tableHeaders.lastModified": "Modificato", + "contents.tableHeaders.lastModifiedBy": "Modificato da", + "contents.tableHeaders.lastModifiedByShort": "Da", + "contents.tableHeaders.nextStatus": "Stato successivo", + "contents.tableHeaders.status": "Stato", + "contents.tableHeaders.version": "Versione", "contents.unsavedChangesText": "Non hai salvato le modifiche. Vuoi salvarle adesso?", "contents.unsavedChangesTitle": "Modifiche non salvate", "contents.updated": "Contenuto aggiornato con successo.", @@ -473,15 +473,15 @@ "dashboard.schemasCard": "Schemi", "dashboard.schemasCardDescription": "Panoramica del modello dei dati di questa app.", "dashboard.stackedChart": "Istogramma in pila", - "dashboard.supportCard": "Feedback & Assistenza", + "dashboard.supportCard": "Feedback & Supporto", "dashboard.supportCardDescription": "Fornisci feedback e richiedi funzionalità per aiutarci a migliorare Squidex..", "dashboard.trafficChart": "Diagramma del traffico delle API", "dashboard.trafficHeader": "Traffico (MB)", "dashboard.trafficLimitLabel": "Limite mensile", "dashboard.trafficSummaryCard": "Riepilogo del traffico delle API", - "dashboard.welcomeText": "Benvenuto su **{app}** dashboard.", + "dashboard.welcomeText": "Benvenuto sulla dashboard **{app}**.", "dashboard.welcomeTitle": "Ciao {user}", - "eventConsumers.count": "Count", + "eventConsumers.count": "Conteggio", "eventConsumers.loadFailed": "Non è stato possibile caricare event consumers. Per favore ricarica.", "eventConsumers.pageTitle": "Eventi degli utenti", "eventConsumers.position": "Posizione", @@ -544,8 +544,8 @@ "roles.addFailed": "Non è stato possibile aggiungere il ruolo. Per favore ricarica.", "roles.default.owner": "Hai come amministratore tutte le funzionalità, compreso cancellare le app.", "roles.default.reader": "Hai un'utenza in sola lettura sia per i contenuti che per le risorse.", - "roles.defaults.developer": "Hai un'utenza che può visualizzare le API, modificare le risorse, i contenuti, gli schema, le regole, i workflows e i pattern.", - "roles.defaults.editor": "Hai un'utenzaCan che può modificare le risorse, i conteuti e visualizzare i workflow.", + "roles.defaults.developer": "Hai un'utenza che può visualizzare le API, modificare le risorse, i contenuti, gli schema, le regole, i workflow e i pattern.", + "roles.defaults.editor": "Hai un'utenza che può modificare le risorse, i conteuti e visualizzare i workflow.", "roles.deleteConfirmText": "Cancella il ruolo", "roles.deleteConfirmTitle": "Sei sicuro di voler eliminare il ruolo?", "roles.loadFailed": "Non è stato possibile caricare i ruoli. Per favore ricarica.", @@ -555,7 +555,7 @@ "roles.revokeFailed": "Non è stato possibile rimuovere il ruolo. Per favore ricarica.", "roles.roleNamePlaceholder": "Inserisci il nome del ruolo", "roles.updateFailed": "Non è stato possibile aggiornare il ruolo. Per favore ricarica.", - "rules.actionEdit": "Mdifica l'Azione", + "rules.actionEdit": "Modifica l'Azione", "rules.cancelFailed": "Non è stato possibile eliminare la regola. Per favore ricarica.", "rules.create": "Crea un nuova Regola", "rules.createFailed": "Non è stato possibile creare una nuova regola. Per favore ricarica.", @@ -650,7 +650,7 @@ "schemas.field.localizable": "Consente la localizzazione", "schemas.field.localizableHint": "Puoi impostare il campo per consentire la localizzazione, ossia che dipende dalla lingua che utilizzi come ad esempio i nomi delle città.", "schemas.field.localizableMarker": "consente la localizzazione", - "schemas.field.lock": "Blocca e impedisce i cambiamenti", + "schemas.field.lock": "Blocca e impedisci i cambiamenti", "schemas.field.lockConfirmText": "Attenzione: Bloccare un campo è un'azione irreversibile! Se blocchi il campo non potrai più sbloccarlo o cancellarlo o cambiarlo. Sei sicuro di voler bloccare il campo?", "schemas.field.lockedMarker": "Bloccato", "schemas.field.nameHint": "Il nome del campo nelle chiamate API response.", @@ -703,9 +703,9 @@ "schemas.fieldTypes.references.countMin": "Numero Min Elementi", "schemas.fieldTypes.references.description": "Link ad altri elementi del contenuto.", "schemas.fieldTypes.references.resolveHint": "Mostra il nome dell'elemento collegato (reference) nella lista dei contenuti quando il numero massimo di elementi è impostato a 1.", - "schemas.fieldTypes.string.characters": "Characters", - "schemas.fieldTypes.string.charactersMax": "Max Characters", - "schemas.fieldTypes.string.charactersMin": "Min Characters", + "schemas.fieldTypes.string.characters": "Caratteri", + "schemas.fieldTypes.string.charactersMax": "Max numero di Caratteri", + "schemas.fieldTypes.string.charactersMin": "Min numero di Caratteri", "schemas.fieldTypes.string.contentType": "Content Type", "schemas.fieldTypes.string.description": "Titoli, nomi, paragrafi.", "schemas.fieldTypes.string.length": "Lunghezza", @@ -713,13 +713,13 @@ "schemas.fieldTypes.string.lengthMin": "Lunghezza Min", "schemas.fieldTypes.string.pattern": "Regex Pattern", "schemas.fieldTypes.string.patternMessage": "Messaggio del Pattern", - "schemas.fieldTypes.string.suggestions": "Suggestions", - "schemas.fieldTypes.string.words": "Words", - "schemas.fieldTypes.string.wordsMax": "Max Words", - "schemas.fieldTypes.string.wordsMin": "Min Words", - "schemas.fieldTypes.tags.count": "Items", - "schemas.fieldTypes.tags.countMax": "Max Items", - "schemas.fieldTypes.tags.countMin": "Min Items", + "schemas.fieldTypes.string.suggestions": "Suggerimenti", + "schemas.fieldTypes.string.words": "Parole", + "schemas.fieldTypes.string.wordsMax": "Numero max di Parole", + "schemas.fieldTypes.string.wordsMin": "Numero min di Parole", + "schemas.fieldTypes.tags.count": "Elementi", + "schemas.fieldTypes.tags.countMax": "Numero max di Elementi", + "schemas.fieldTypes.tags.countMin": "Numero min di Elementi", "schemas.fieldTypes.tags.description": "Formato speciale per i tag.", "schemas.fieldTypes.ui.description": "Separatore per il pannello delle modifiche della UI.", "schemas.hideFieldFailed": "Non è stato possibile nascondere il campo. Per favore ricarica.", @@ -765,7 +765,7 @@ "schemas.synchronizeFailed": "Non è stato possibile sincronizzare lo schema. Per favore ricarica.", "schemas.tabFields": "Campi", "schemas.tabJson": "Json", - "schemas.tabMore": "Di più", + "schemas.tabMore": "Altro", "schemas.tabScripts": "Script", "schemas.tabUI": "UI", "schemas.ui": "Campi assegnati", @@ -784,7 +784,7 @@ "search.advancedTour": "Fai clic su questa icona per visualizzare il menu della ricerca avanzata!", "search.customQuery": "Query personalizzata", "search.fullTextTour": "Cerca contenuti utilizzando la ricerca testuale su tutti i campi e le lingue!", - "search.help": "Ulteriori informazioni sui filtri su [Documentation](https://https://docs.squidex.io/04-guides/02-api.html).", + "search.help": "Ulteriori informazioni sui filtri su [Documentazione](https://https://docs.squidex.io/04-guides/02-api.html).", "search.myQueries": "Le mie query", "search.nameQuery": "Dai un nome alla query", "search.queriesEmpty": "Ricerca per {types} e utilizza l'icona nella ricerca per salvare la query per tutti i collaboratori.", diff --git a/backend/i18n/source/backend_it.json b/backend/i18n/source/backend_it.json index 5ccac0775..34cbb4dea 100644 --- a/backend/i18n/source/backend_it.json +++ b/backend/i18n/source/backend_it.json @@ -1,7 +1,12 @@ { "annotations_AbsoluteUrl": "Il campo {name|lower} deve essere un URL assoluto.", "annotations_Compare": "Il campo {name|lower} deve essere uguale a {other|lower}.", + "annotations_EmailAddress": "Il campo {name|lower} non è un indirizzo email valido.", + "annotations_Range": "Il campo {name|lower} deve essere tra {min} e {max}.", + "annotations_RegularExpression": "Il campo {name|lower} non è.", "annotations_Required": "Il campo è {name|lower} obbligatorio.", + "annotations_StringLength": "The field {name|lower} must be a string with a maximum length of {max}.", + "annotations_StringLengthMinimum": "The field {name|lower} must be a string with a minimum length of {min} and a maximum length of {max}.", "apps.alreadyArchieved": "La App è stata già archiviata.", "apps.clients.idAlreadyExists": "Un client con lo stesso id esiste già.", "apps.contributors.cannotChangeYourself": "Non puoi cambiare il tuo ruolo.", @@ -9,7 +14,7 @@ "apps.contributors.onlyOneOwner": "Non è possibile rimuovere l'unico owner.", "apps.languages.fallbackNotFound": "La App non ha configurato una lingua alternativa'{fallback}'.", "apps.languages.languageAlreadyAdded": "La lingua è stata già inserita.", - "apps.languages.masterLanguageNoFallbacks": "La lingua master language non ha lingue alternative.", + "apps.languages.masterLanguageNoFallbacks": "La lingua master non ha lingue alternative.", "apps.languages.masterLanguageNotOptional": "La lingua master non può essere opzionale.", "apps.languages.masterLanguageNotRemovable": "La lingua master non può essere rimossa.", "apps.nameAlreadyExists": "Esiste già un'app con lo stesso nome.", @@ -40,6 +45,7 @@ "common.clientd": "ID Client", "common.clientId": "ID Client", "common.clientSecret": "Secret Client", + "common.contentType": "Content type", "common.contributorId": "ID o Email del collaboratore", "common.data": "Data", "common.defaultValue": "Valore predefinito", @@ -66,18 +72,22 @@ "common.language": "Codice della lingua", "common.login": "Accedi", "common.logout": "Esci", + "common.maxCharacters": "Numero massimo di caratteri", "common.maxHeight": "Altezza massima", "common.maxItems": "Numeri massimo di elementi", "common.maxLength": "Lunghezza massima", "common.maxSize": "Dimensione massima", "common.maxValue": "Valore massimo", "common.maxWidth": "Larghezza massima", + "common.maxWords": "Numero massimo di parole", + "common.minCharacters": "Numero minimo di caratteri", "common.minHeight": "Altezza minima", "common.minItems": "Numero minimo elementi", "common.minLength": "Lunghezza minima", "common.minSize": "Dimensione minima", "common.minValue": "Valore minimo", "common.minWidth": "Larghezza massima", + "common.minWords": "Numero minimo di parole", "common.name": "Nome", "common.notFoundValue": "- non trovato -", "common.numDays": "Num. giorni", @@ -144,26 +154,49 @@ "contents.validation.itemCount": "Deve avere esattamente {count} elemento(i).", "contents.validation.itemCountBetween": "Deve essere tra {min} e {max} elemento(i).", "contents.validation.max": "Deve esseer minore o uguale a {max}.", + "contents.validation.maxCharacters": "Il testo non deve avere più di {max} carattere(i).", "contents.validation.maximumHeight": "L'altezza {height}px deve essere inferiore a {max}px.", "contents.validation.maximumSize": "La dimensione {size} deve essere inferiore a {max}.", "contents.validation.maximumWidth": "La larghezza {width}px deve essere inferiore a {max}px.", "contents.validation.maxItems": "Non deve avere più di {max} elemento(i).", "contents.validation.maxLength": "Non deve avere più di {max} carattere(i).", + "contents.validation.maxWords": "Non deve avere più di {max} parola(e).", "contents.validation.min": "Deve essere maggiore o uguale a {min}.", "contents.validation.minimumHeight": "L'altezza {height}px deve essere maggiore di {min}px.", "contents.validation.minimumSize": "La dimensione {size} deve essere maggiore di {min}.", "contents.validation.minimumWidth": "La larghezza {width}px deve essere maggiore di {min}px.", "contents.validation.minItems": "Deve avere almento {min} elemento(i).", "contents.validation.minLength": "Deve avere almeno {min} carattere(i).", + "contents.validation.minNormalCharacters": "Deve avere almeno un testo di {min} carattere(i).", + "contents.validation.minWords": "Deve avere almeno {min} parola(e).", "contents.validation.mustBeEmpty": "Il valore non deve essere definito.", + "contents.validation.normalCharacterCount": "Deve essere esattamente un testo di {count} carattere(i).", + "contents.validation.normalCharactersBetween": "Deve essere un testo tra {min} e {max} carattere(i).", "contents.validation.notAllowed": "Non è un valore consentito.", "contents.validation.pattern": "Deve seguire il pattern.", "contents.validation.regexTooSlow": "La Regex è troppo lenta.", "contents.validation.required": "Il campo è obbligatorio.", "contents.validation.unique": "Esiste un altro contenuto con lo stesso valore.", "contents.validation.unknownField": "Non è noto {fieldType}.", + "contents.validation.wordCount": "Deve avere esattamente {count} parola(e).", + "contents.validation.wordsBetween": "Deve essere tra {min} e {max} parola(e).", "contents.workflowErorPublishing": "Il workflow del contenuto impedisce la pubblicazione.", "contents.workflowErrorUpdate": "Il workflow non consente le modifiche per lo stato {status}", + "dotnet_identity_DefaultEror": "Si è verificato un errore sconosciuto.", + "dotnet_identity_DuplicateEmail": "Email già in uso.", + "dotnet_identity_DuplicateUserName": "Nome utente già in uso.", + "dotnet_identity_InvalidEmail": "L'Email non è valida.", + "dotnet_identity_InvalidUserName": "Il nome utente '{0}' non è valido, può contenere solo lettere e numeri.", + "dotnet_identity_LoginAlreadyAssociated": "Esiste già un utente con queste credenziali di accesso.", + "dotnet_identity_PasswordMismatch": "Password errata.", + "dotnet_identity_PasswordRequiresDigit": "La Password devono contenere almeno un numero ('0'-'9').", + "dotnet_identity_PasswordRequiresLower": "La passowrd deve avere almeno una lettera minuscola ('a'-'z').", + "dotnet_identity_PasswordRequiresNonAlphanumeric": "La passowrd deve avere almeno un carattere non alfanumerico.", + "dotnet_identity_PasswordRequiresUniqueChars": "La password deve essere composta almeno da {0} caratteri differenti.", + "dotnet_identity_PasswordRequiresUpper": "La password deve avere almeno una lettera maiuscola ('A'-'Z').", + "dotnet_identity_PasswordTooShort": "La password è troppo corta.", + "dotnet_identity_PwnedError": "Questa password è apparsa in un database di password compromesso e non dovrebbe più essere utilizzata. Se l'hai usata, cambiala!", + "dotnet_identity_UserLockedOut": "L'utente è bloccato.", "exception.invalidJsonQuery": "La query Json non è valida: {message}", "exception.invalidJsonQueryJson": "La query Json non è valida: {message}", "exceptions.domainObjectDeleted": "L'entità ({id}) è stata cancellata.", @@ -178,17 +211,17 @@ "history.apps.languagedRemoved": "rimossa lingua {[Language]}", "history.apps.languagedSetToMaster": "cambiata la lingua master in {[Language]}", "history.apps.languagedUpdated": "aggiornata la lingua {[Language]}", - "history.apps.patternAdded": "adggiunto pattern {[Name]}", - "history.apps.patternDeleted": "eliminato pattern {[PatternId]}", - "history.apps.patternUpdated": "modificato pattern {[Name]}", - "history.apps.planChanged": "cambiato il piano in {[Plan]}", - "history.apps.planReset": "riconfigurato il piano", - "history.apps.roleAdded": "aggiunto il ruolo {[Name]}", - "history.apps.roleDeleted": "eliminato role {[Name]}", - "history.apps.roleUpdated": "aggiornato role {[Name]}", - "history.assets.replaced": "risorsa sostituita.", - "history.assets.updated": "risorsa aggiornata.", - "history.assets.uploaded": "risorsa caricata.", + "history.apps.patternAdded": "ha aggiunto pattern {[Name]}", + "history.apps.patternDeleted": "ha eliminato pattern {[PatternId]}", + "history.apps.patternUpdated": "ha modificato pattern {[Name]}", + "history.apps.planChanged": "ha cambiato il piano in {[Plan]}", + "history.apps.planReset": "ha riconfigurato il piano", + "history.apps.roleAdded": "ha aggiunto il ruolo {[Name]}", + "history.apps.roleDeleted": "ha eliminato role {[Name]}", + "history.apps.roleUpdated": "ha aggiornato role {[Name]}", + "history.assets.replaced": "ha sostituito la risorsa.", + "history.assets.updated": "ha aggiornato la risorsa.", + "history.assets.uploaded": "ha caricato la risorsa.", "history.contents.created": "creato il contenuto {[Schema]}.", "history.contents.deleted": "cancellato il contenuto {[Schema]}.", "history.contents.draftCreated": "creata una nuova bozza.", @@ -205,12 +238,12 @@ "history.schemas.fieldLocked": "bloccato il campo {[Field]} dallo schema {[Name]}.", "history.schemas.fieldShown": "mostrato il campo {[Field]} dallo schema {[Name]}.", "history.schemas.fieldsReordered": "riordinati i campi dello schema {[Name]}.", - "history.schemas.fieldUpdated": "aggiornato il campo {[Field]} dello schema {[Name]}.", - "history.schemas.published": "pubblicato lo schema {[Name]}.", - "history.schemas.scriptsConfigured": "configurato lo script per lo schema {[Name]}.", - "history.schemas.unpublished": "rimosso dalla pubblicazione lo schema {[Name]}.", - "history.schemas.updated": "aggiornato lo schema {[Name]}.", - "history.statusChanged": "cambiato lo stato del contenuto {[Schema]} in {[Status]}.", + "history.schemas.fieldUpdated": "ha aggiornato il campo {[Field]} dello schema {[Name]}.", + "history.schemas.published": "ha pubblicato lo schema {[Name]}.", + "history.schemas.scriptsConfigured": "ha configurato lo script per lo schema {[Name]}.", + "history.schemas.unpublished": "ha rimosso dalla pubblicazione lo schema {[Name]}.", + "history.schemas.updated": "ha aggiornato lo schema {[Name]}.", + "history.statusChanged": "ha cambiato lo stato del contenuto {[Schema]} in {[Status]}.", "login.githubPrivateEmail": "Il tuo indirizzo email è impostato su privato in Github. Impostalo come pubblico per poter utilizzare il login Github.", "rules.alreadyDeleted": "La regola è stata già cancellata.", "rules.ruleAlreadyRunning": "E' in esecuzione un'altra regola.", @@ -281,7 +314,7 @@ "users.profile.generateClient": "Creato", "users.profile.generateClientDone": "Secret client generato con successo.", "users.profile.headline": "Profile modificato", - "users.profile.hideProfile": "Non mostrare il mio profilo agli altri utentiDo not show my profile to other users", + "users.profile.hideProfile": "Non mostrare il mio profilo agli altri utenti", "users.profile.loginsTitle": "Login", "users.profile.passwordTitle": "Password", "users.profile.pii": "Informazioni personali", diff --git a/backend/i18n/source/frontend_it.json b/backend/i18n/source/frontend_it.json index 904e20258..a27b7c9e1 100644 --- a/backend/i18n/source/frontend_it.json +++ b/backend/i18n/source/frontend_it.json @@ -10,8 +10,8 @@ "apps.appNameHint": "Puoi utilizzare solo lettere, numeri e trattini e non più di 40 caratteri.", "apps.appNameValidationMessage": "Il nome può contenere lettere minuscole (a-z), numeri e trattini all'interno.", "apps.appNameWarning": "Il nome della app non potrà essere cambiato in un secondo momento.", - "apps.appsButtonCreate": "Panoramica delle App", - "apps.appsButtonFallbackTitle": "Panoramica delle App", + "apps.appsButtonCreate": "Nuova App", + "apps.appsButtonFallbackTitle": "Lista App", "apps.archieve": "Archivia l'App", "apps.archieveConfirmText": "Rimuovi il pattern", "apps.archieveConfirmTitle": "Sei sicuro di voler archiviare questa app?", @@ -20,14 +20,14 @@ "apps.create": "Crea un'App", "apps.createBlankApp": "Nuova App.", "apps.createBlankAppDescription": "Crea una app vuota senza contenuti o schema.", - "apps.createBlogApp": "Nuovo esempio di blog", + "apps.createBlogApp": "Nuovo blog", "apps.createBlogAppDescription": "Inizia con il nostro blog già pronto per l'uso.", "apps.createFailed": "Non è stato possibile creare l'app. Per favore ricarica.", - "apps.createIdentityApp": "New Identity App", + "apps.createIdentityApp": "Nuova Identity App", "apps.createIdentityAppDescription": "Crea un app per Squidex Identity.", "apps.createIdentityAppV2": "Nuova Identity App V2", "apps.createIdentityAppV2Description": "Creare un app per Squidex Identity V2.", - "apps.createProfileApp": "Nuovo esempio di Profilo", + "apps.createProfileApp": "Nuovo Profilo", "apps.createProfileAppDescription": "Crea la tua pagina del profilo.", "apps.createWithTemplate": "Create un esempio di {template}", "apps.empty": "Non stai ancora collaborando su nessuna app", @@ -81,6 +81,8 @@ "assets.protected": "Protetto", "assets.refreshTooltip": "Aggiorna le risorse (CTRL + SHIFT + R)", "assets.reloaded": "Risorse ricaricate.", + "assets.removeConfirmText": "Sei sicuro di voler cancellare la risorsa?", + "assets.removeConfirmTitle": "Risorsa cancellata", "assets.renameFolder": "Rinomina la cartella", "assets.replaceConfirmText": "Sei sicuro di voler sostituire la risorsa con una nuova versione?", "assets.replaceConfirmTitle": "Sostituisco la risorsa?", @@ -88,6 +90,8 @@ "assets.searchByName": "Ricerca per nome", "assets.searchByTags": "Ricerca per tag", "assets.selectMany": "Seleziona le risorse", + "assets.specialFolder.parent": "", + "assets.specialFolder.root": "Risorse", "assets.tabFocusPoint": "Punto focale", "assets.tabHistory": "Cronologia", "assets.tabImage": "Immagine", @@ -134,6 +138,8 @@ "clients.addFailed": "Non è stato possibile aggiungere un client. Per favore ricarica.", "clients.allowAnonymous": "Consenti l'accesso anonimo.", "clients.allowAnonymousHint": "Consenti l'accesso alle API senza token di accesso a tutte le risorse che sono configurate per il ruolo di questo client. E' possibile avere un solo client impostato con accesso anonimo.", + "clients.apiCallsLimit": "Numero Max di chiamate alle API", + "clients.apiCallsLimitHint": "Limita il numero di chiamate al mese effettuabili dal client alle API calls per riservare ai client più importanti il numero di chiamate API disponili.", "clients.clientIdValidationMessage": "Il nome deve contenere solo lettere, numeri, trattini e spaziNa.", "clients.clientNamePlaceholder": "Inserisci il nome del client", "clients.connect": "Connettere", @@ -197,22 +203,24 @@ "common.clientSecret": "Secret Client", "common.clipboardAdded": "Il valore è stato aggiunto nei tuoi appunti.", "common.clone": "Clona", - "common.cluster": "Raggruppamento", - "common.clusterPageTitle": "Raggruppamento", + "common.cluster": "Cluster", + "common.clusterPageTitle": "Cluster", "common.comments": "Commenti", "common.confirm": "Conferma", - "common.consumers": "Utenti", - "common.content": "Contentenuto", - "common.contents": "Contentenuti", + "common.consumers": "Servizi", + "common.content": "Contenuto", + "common.contents": "Contenuti", "common.continue": "Continua", "common.contributors": "Collaboratori", "common.create": "Crea", "common.created": "Creato", "common.date": "Data", + "common.dateTimeEditor.local": "Locale", "common.dateTimeEditor.now": "Data e Ora attuale", "common.dateTimeEditor.nowTooltip": "Imposta la data e l'ora attuale (UTC)", "common.dateTimeEditor.today": "Oggi", "common.dateTimeEditor.todayTooltip": "Imposta la data di oggi (UTC)", + "common.dateTimeEditor.utc": "UTC", "common.delete": "Cancella", "common.description": "Descrizione", "common.displayName": "Nome visualizzato", @@ -267,6 +275,16 @@ "common.preview": "Anteprima", "common.product": "Squidex Headless CMS", "common.project": "Progetto", + "common.queryOperators.contains": "contiene", + "common.queryOperators.empty": "è vuoto", + "common.queryOperators.endsWith": "finisce con", + "common.queryOperators.eq": "è uguale a", + "common.queryOperators.ge": "è maggiore di o uguale a", + "common.queryOperators.gt": "è maggiore di", + "common.queryOperators.le": "è minore di o uguale a", + "common.queryOperators.lt": "è minore di", + "common.queryOperators.ne": "è uguale a", + "common.queryOperators.startsWith": "inizia con", "common.refresh": "Aggiorna", "common.rename": "Rinomina", "common.requiredHint": "obbligatorio", @@ -341,16 +359,19 @@ "contents.draftStatus": "Nuova versione", "contents.editPageTitle": "Modifica contenuto", "contents.editTitle": "Modifica il contenuto", + "contents.invariantFieldDescription": "Il campo '{fieldName}' del contenuto.", "contents.languageModeAll": "Tutte le lingue", "contents.languageModeSingle": "Una sola lingua", - "contents.lastModifiedByFieldDescription": "L'utente che ha modificato l'elememto l'ultima voltaThe user who modified the content item the last time.", + "contents.lastModifiedByFieldDescription": "L'utente che ha modificato l'elemento l'ultima volta.", "contents.lastModifiedFieldDescription": "La data e l'ora dell'ultima modifica del contenuto.", "contents.lastUpdatedLabel": "Ultimo aggiornamento", "contents.loadContent": "Carica", "contents.loadContentFailed": "Non è stato possibile caricare il contenuto. Per favore ricarica.", "contents.loadDataFailed": "Non è stato possibile caricare i dati. Per favore ricarica.", "contents.loadFailed": "Non è stato possibile caricare i contenuti. Per favore ricarica.", - "contents.loadVersionFailed": "Non è stato possibile version a new version. Per favore ricarica.", + "contents.loadVersionFailed": "Non è stato possibile creare una nuova versione. Per favore ricarica.", + "contents.localizedFieldDescription": "Il campo '{fieldName}' del contenuto (localizzato).", + "contents.newStatusFieldDescription": "Nuovo stato per l'elemento del contenuto.", "contents.noReference": "- Nessun collegamento -", "contents.pendingChangesTextToChange": "Non hai salvato le modifiche.\n\nSe cambi lo stato perderai le modifiche.\n\n**Sei sicuro di voler continuare?**", "contents.pendingChangesTextToClose": "Non hai salvato le modifiche.\n\nChiudendo il contenuto corrente perderai tutte le modifiche.\n\n**Sei sicuro di voler continuare?**", @@ -362,6 +383,8 @@ "contents.referencesSelectSchema": "Seleziona {schema}", "contents.refreshTooltip": "Aggiorna i contenuti (CTRL + SHIFT + R)", "contents.reloaded": "Contenuti aggiornati.", + "contents.removeConfirmText": "Sei sicuro di voler rimuovere il contenuto?", + "contents.removeConfirmTitle": "Cancella il contenuto", "contents.saveAndPublish": "Salva e pubblica", "contents.scheduledAt": "alle", "contents.scheduledAtLabel": "alle", @@ -374,6 +397,16 @@ "contents.statusQueries": "Stato Query", "contents.stockPhotoEmpty": "Nessuna selezione", "contents.stockPhotoSearch": "Cerca foto su Unsplash", + "contents.tableHeaders.created": "Creato", + "contents.tableHeaders.createdBy": "Creato da", + "contents.tableHeaders.createdByShort": "Da", + "contents.tableHeaders.id": "Id", + "contents.tableHeaders.lastModified": "Modificato", + "contents.tableHeaders.lastModifiedBy": "Modificato da", + "contents.tableHeaders.lastModifiedByShort": "Da", + "contents.tableHeaders.nextStatus": "Stato successivo", + "contents.tableHeaders.status": "Stato", + "contents.tableHeaders.version": "Versione", "contents.unsavedChangesText": "Non hai salvato le modifiche. Vuoi salvarle adesso?", "contents.unsavedChangesTitle": "Modifiche non salvate", "contents.updated": "Contenuto aggiornato con successo.", @@ -440,14 +473,15 @@ "dashboard.schemasCard": "Schemi", "dashboard.schemasCardDescription": "Panoramica del modello dei dati di questa app.", "dashboard.stackedChart": "Istogramma in pila", - "dashboard.supportCard": "Feedback & Assistenza", + "dashboard.supportCard": "Feedback & Supporto", "dashboard.supportCardDescription": "Fornisci feedback e richiedi funzionalità per aiutarci a migliorare Squidex..", "dashboard.trafficChart": "Diagramma del traffico delle API", "dashboard.trafficHeader": "Traffico (MB)", "dashboard.trafficLimitLabel": "Limite mensile", "dashboard.trafficSummaryCard": "Riepilogo del traffico delle API", - "dashboard.welcomeText": "Benvenuto su **{app}** dashboard.", + "dashboard.welcomeText": "Benvenuto sulla dashboard **{app}**.", "dashboard.welcomeTitle": "Ciao {user}", + "eventConsumers.count": "Conteggio", "eventConsumers.loadFailed": "Non è stato possibile caricare event consumers. Per favore ricarica.", "eventConsumers.pageTitle": "Eventi degli utenti", "eventConsumers.position": "Posizione", @@ -510,8 +544,8 @@ "roles.addFailed": "Non è stato possibile aggiungere il ruolo. Per favore ricarica.", "roles.default.owner": "Hai come amministratore tutte le funzionalità, compreso cancellare le app.", "roles.default.reader": "Hai un'utenza in sola lettura sia per i contenuti che per le risorse.", - "roles.defaults.developer": "Hai un'utenza che può visualizzare le API, modificare le risorse, i contenuti, gli schema, le regole, i workflows e i pattern.", - "roles.defaults.editor": "Hai un'utenzaCan che può modificare le risorse, i conteuti e visualizzare i workflow.", + "roles.defaults.developer": "Hai un'utenza che può visualizzare le API, modificare le risorse, i contenuti, gli schema, le regole, i workflow e i pattern.", + "roles.defaults.editor": "Hai un'utenza che può modificare le risorse, i conteuti e visualizzare i workflow.", "roles.deleteConfirmText": "Cancella il ruolo", "roles.deleteConfirmTitle": "Sei sicuro di voler eliminare il ruolo?", "roles.loadFailed": "Non è stato possibile caricare i ruoli. Per favore ricarica.", @@ -521,7 +555,7 @@ "roles.revokeFailed": "Non è stato possibile rimuovere il ruolo. Per favore ricarica.", "roles.roleNamePlaceholder": "Inserisci il nome del ruolo", "roles.updateFailed": "Non è stato possibile aggiornare il ruolo. Per favore ricarica.", - "rules.actionEdit": "Mdifica l'Azione", + "rules.actionEdit": "Modifica l'Azione", "rules.cancelFailed": "Non è stato possibile eliminare la regola. Per favore ricarica.", "rules.create": "Crea un nuova Regola", "rules.createFailed": "Non è stato possibile creare una nuova regola. Per favore ricarica.", @@ -616,7 +650,7 @@ "schemas.field.localizable": "Consente la localizzazione", "schemas.field.localizableHint": "Puoi impostare il campo per consentire la localizzazione, ossia che dipende dalla lingua che utilizzi come ad esempio i nomi delle città.", "schemas.field.localizableMarker": "consente la localizzazione", - "schemas.field.lock": "Blocca e impedisce i cambiamenti", + "schemas.field.lock": "Blocca e impedisci i cambiamenti", "schemas.field.lockConfirmText": "Attenzione: Bloccare un campo è un'azione irreversibile! Se blocchi il campo non potrai più sbloccarlo o cancellarlo o cambiarlo. Sei sicuro di voler bloccare il campo?", "schemas.field.lockedMarker": "Bloccato", "schemas.field.nameHint": "Il nome del campo nelle chiamate API response.", @@ -669,16 +703,23 @@ "schemas.fieldTypes.references.countMin": "Numero Min Elementi", "schemas.fieldTypes.references.description": "Link ad altri elementi del contenuto.", "schemas.fieldTypes.references.resolveHint": "Mostra il nome dell'elemento collegato (reference) nella lista dei contenuti quando il numero massimo di elementi è impostato a 1.", + "schemas.fieldTypes.string.characters": "Caratteri", + "schemas.fieldTypes.string.charactersMax": "Max numero di Caratteri", + "schemas.fieldTypes.string.charactersMin": "Min numero di Caratteri", + "schemas.fieldTypes.string.contentType": "Content Type", "schemas.fieldTypes.string.description": "Titoli, nomi, paragrafi.", "schemas.fieldTypes.string.length": "Lunghezza", "schemas.fieldTypes.string.lengthMax": "Lunghezza Max", "schemas.fieldTypes.string.lengthMin": "Lunghezza Min", "schemas.fieldTypes.string.pattern": "Regex Pattern", "schemas.fieldTypes.string.patternMessage": "Messaggio del Pattern", - "schemas.fieldTypes.string.suggestions": "Suggestions", - "schemas.fieldTypes.tags.count": "Items", - "schemas.fieldTypes.tags.countMax": "Max Items", - "schemas.fieldTypes.tags.countMin": "Min Items", + "schemas.fieldTypes.string.suggestions": "Suggerimenti", + "schemas.fieldTypes.string.words": "Parole", + "schemas.fieldTypes.string.wordsMax": "Numero max di Parole", + "schemas.fieldTypes.string.wordsMin": "Numero min di Parole", + "schemas.fieldTypes.tags.count": "Elementi", + "schemas.fieldTypes.tags.countMax": "Numero max di Elementi", + "schemas.fieldTypes.tags.countMin": "Numero min di Elementi", "schemas.fieldTypes.tags.description": "Formato speciale per i tag.", "schemas.fieldTypes.ui.description": "Separatore per il pannello delle modifiche della UI.", "schemas.hideFieldFailed": "Non è stato possibile nascondere il campo. Per favore ricarica.", @@ -724,7 +765,7 @@ "schemas.synchronizeFailed": "Non è stato possibile sincronizzare lo schema. Per favore ricarica.", "schemas.tabFields": "Campi", "schemas.tabJson": "Json", - "schemas.tabMore": "Di più", + "schemas.tabMore": "Altro", "schemas.tabScripts": "Script", "schemas.tabUI": "UI", "schemas.ui": "Campi assegnati", @@ -743,7 +784,7 @@ "search.advancedTour": "Fai clic su questa icona per visualizzare il menu della ricerca avanzata!", "search.customQuery": "Query personalizzata", "search.fullTextTour": "Cerca contenuti utilizzando la ricerca testuale su tutti i campi e le lingue!", - "search.help": "Ulteriori informazioni sui filtri su [Documentation](https://https://docs.squidex.io/04-guides/02-api.html).", + "search.help": "Ulteriori informazioni sui filtri su [Documentazione](https://https://docs.squidex.io/04-guides/02-api.html).", "search.myQueries": "Le mie query", "search.nameQuery": "Dai un nome alla query", "search.queriesEmpty": "Ricerca per {types} e utilizza l'icona nella ricerca per salvare la query per tutti i collaboratori.", diff --git a/backend/i18n/translate.bat b/backend/i18n/translate.bat index 0444bb027..0fb87e19f 100644 --- a/backend/i18n/translate.bat +++ b/backend/i18n/translate.bat @@ -1,7 +1,8 @@ cd translator\Squidex.Translator -dotnet run translate check-backend D:\Squidex -dotnet run translate check-frontend D:\Squidex +dotnet run translate check-backend C:\Users\federica.pisu\squidex\mysquidex\squidex +dotnet run translate check-frontend C:\Users\federica.pisu\squidex\mysquidex\squidex + +dotnet run translate gen-frontend C:\Users\federica.pisu\squidex\mysquidex\squidex +dotnet run translate gen-backend C:\Users\federica.pisu\squidex\mysquidex\squidex -dotnet run translate gen-frontend D:\Squidex -dotnet run translate gen-backend D:\Squidex \ No newline at end of file diff --git a/backend/src/Squidex.Shared/Texts.it.resx b/backend/src/Squidex.Shared/Texts.it.resx index 005a0f02c..9af5e329f 100644 --- a/backend/src/Squidex.Shared/Texts.it.resx +++ b/backend/src/Squidex.Shared/Texts.it.resx @@ -71,22 +71,22 @@ Il campo {0} deve essere uguale a {1}. - The field {name|lower} is not a valid email address. + Il campo {name|lower} non è un indirizzo email valido. - The field {0} is not a valid email address. + Il campo {0} non è un indirizzo email valido. - The field {name|lower} must be between {min} and {max}. + Il campo {name|lower} deve essere tra {min} e {max}. - The field {0} must be between {1} and {2}. + Il campo {0} deve essere tra {1} e {2}. - The field {name|lower} is not. + Il campo {name|lower} non è. - The field {0} is not. + Il campo {0} non è. Il campo è {name|lower} obbligatorio. @@ -128,7 +128,7 @@ La lingua è stata già inserita. - La lingua master language non ha lingue alternative. + La lingua master non ha lingue alternative. La lingua master non può essere opzionale. @@ -302,7 +302,7 @@ Esci - Max characters + Numero massimo di caratteri Altezza massima @@ -323,10 +323,10 @@ Larghezza massima - Max words + Numero massimo di parole - Min characters + Numero minimo di caratteri Altezza minima @@ -347,7 +347,7 @@ Larghezza massima - Min words + Numero minimo di parole Nome @@ -548,7 +548,7 @@ Deve esseer minore o uguale a {max}. - Must not have more than {max} text character(s). + Il testo non deve avere più di {max} carattere(i). L'altezza {height}px deve essere inferiore a {max}px. @@ -566,7 +566,7 @@ Non deve avere più di {max} carattere(i). - Must not have more than {max} word(s). + Non deve avere più di {max} parola(e). Deve essere maggiore o uguale a {min}. @@ -587,19 +587,19 @@ Deve avere almeno {min} carattere(i). - Must have at least {min} text character(s). + Deve avere almeno un testo di {min} carattere(i). - Must have at least {min} word(s). + Deve avere almeno {min} parola(e). Il valore non deve essere definito. - Must have exactly {count} text character(s). + Deve essere esattamente un testo di {count} carattere(i). - Must have between {min} and {max} text character(s). + Deve essere un testo tra {min} e {max} carattere(i). Non è un valore consentito. @@ -620,10 +620,10 @@ Non è noto {fieldType}. - Must have exactly {count} word(s). + Deve avere esattamente {count} parola(e). - Must have between {min} and {max} word(s). + Deve essere tra {min} e {max} parola(e). Il workflow del contenuto impedisce la pubblicazione. @@ -632,49 +632,49 @@ Il workflow non consente le modifiche per lo stato {status} - An unknown failure has occurred. + Si è verificato un errore sconosciuto. - Email is already taken. + Email già in uso. - User name is already taken. + Nome utente già in uso. - Email is invalid. + L'Email non è valida. - User name '{0}' is invalid, can only contain letters or digits. + Il nome utente '{0}' non è valido, può contenere solo lettere e numeri. - A user with this login already exists. + Esiste già un utente con queste credenziali di accesso. - Incorrect password. + Password errata. - Passwords must have at least one digit ('0'-'9'). + La Password devono contenere almeno un numero ('0'-'9'). - Passwords must have at least one lowercase ('a'-'z'). + La passowrd deve avere almeno una lettera minuscola ('a'-'z'). - Passwords must have at least one non alphanumeric character. + La passowrd deve avere almeno un carattere non alfanumerico. - Passwords must use at least {0} different characters. + La password deve essere composta almeno da {0} caratteri differenti. - Passwords must have at least one uppercase ('A'-'Z'). + La password deve avere almeno una lettera maiuscola ('A'-'Z'). - Passwords is too short. + La password è troppo corta. - This password has previously appeared in a data breach and should never be used. If you have ever used it anywhere before, change it! + Questa password è apparsa in un database di password compromesso e non dovrebbe più essere utilizzata. Se l'hai usata, cambiala! - User is locked out. + L'utente è bloccato. La query Json non è valida: {message} @@ -719,37 +719,37 @@ aggiornata la lingua {[Language]} - adggiunto pattern {[Name]} + ha aggiunto pattern {[Name]} - eliminato pattern {[PatternId]} + ha eliminato pattern {[PatternId]} - modificato pattern {[Name]} + ha modificato pattern {[Name]} - cambiato il piano in {[Plan]} + ha cambiato il piano in {[Plan]} - riconfigurato il piano + ha riconfigurato il piano - aggiunto il ruolo {[Name]} + ha aggiunto il ruolo {[Name]} - eliminato role {[Name]} + ha eliminato role {[Name]} - aggiornato role {[Name]} + ha aggiornato role {[Name]} - risorsa sostituita. + ha sostituito la risorsa. - risorsa aggiornata. + ha aggiornato la risorsa. - risorsa caricata. + ha caricato la risorsa. creato il contenuto {[Schema]}. @@ -800,22 +800,22 @@ riordinati i campi dello schema {[Name]}. - aggiornato il campo {[Field]} dello schema {[Name]}. + ha aggiornato il campo {[Field]} dello schema {[Name]}. - pubblicato lo schema {[Name]}. + ha pubblicato lo schema {[Name]}. - configurato lo script per lo schema {[Name]}. + ha configurato lo script per lo schema {[Name]}. - rimosso dalla pubblicazione lo schema {[Name]}. + ha rimosso dalla pubblicazione lo schema {[Name]}. - aggiornato lo schema {[Name]}. + ha aggiornato lo schema {[Name]}. - cambiato lo stato del contenuto {[Schema]} in {[Status]}. + ha cambiato lo stato del contenuto {[Schema]} in {[Status]}. Il tuo indirizzo email è impostato su privato in Github. Impostalo come pubblico per poter utilizzare il login Github. @@ -1028,7 +1028,7 @@ Profile modificato - Non mostrare il mio profilo agli altri utentiDo not show my profile to other users + Non mostrare il mio profilo agli altri utenti Login From 41c395d533ebd5b88e14579345731a5f16efd4a0 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 15 Sep 2020 19:35:42 +0200 Subject: [PATCH 12/21] Code cleanup. --- backend/i18n/translate.bat | 8 +- backend/i18n/translate.sh | 10 +- .../GraphQL/Types/AppMutationsGraphType.cs | 344 ------------------ .../Types/ContentDataGraphInputType.cs | 70 ---- .../Types/GeolocationInputGraphType.cs | 31 -- .../GraphQL/Types/InputFieldExtensions.cs | 20 - .../GraphQL/Types/InputFieldVisitor.cs | 71 ---- .../GraphQL/Types/NestedInputGraphType.cs | 47 --- 8 files changed, 8 insertions(+), 593 deletions(-) delete mode 100644 src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/AppMutationsGraphType.cs delete mode 100644 src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentDataGraphInputType.cs delete mode 100644 src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/GeolocationInputGraphType.cs delete mode 100644 src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/InputFieldExtensions.cs delete mode 100644 src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/InputFieldVisitor.cs delete mode 100644 src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/NestedInputGraphType.cs diff --git a/backend/i18n/translate.bat b/backend/i18n/translate.bat index 0fb87e19f..d300b75d8 100644 --- a/backend/i18n/translate.bat +++ b/backend/i18n/translate.bat @@ -1,8 +1,8 @@ cd translator\Squidex.Translator -dotnet run translate check-backend C:\Users\federica.pisu\squidex\mysquidex\squidex -dotnet run translate check-frontend C:\Users\federica.pisu\squidex\mysquidex\squidex +dotnet run translate check-backend ..\..\..\.. +dotnet run translate check-frontend ..\..\..\.. -dotnet run translate gen-frontend C:\Users\federica.pisu\squidex\mysquidex\squidex -dotnet run translate gen-backend C:\Users\federica.pisu\squidex\mysquidex\squidex +dotnet run translate gen-frontend ..\..\..\.. +dotnet run translate gen-backend ..\..\..\.. diff --git a/backend/i18n/translate.sh b/backend/i18n/translate.sh index 74b698a95..9a039d81d 100755 --- a/backend/i18n/translate.sh +++ b/backend/i18n/translate.sh @@ -1,10 +1,8 @@ #!/bin/bash -PATH=${1:-/Squidex} - cd translator/Squidex.Translator -/usr/local/share/dotnet/dotnet run translate check-backend $1 -/usr/local/share/dotnet/dotnet run translate check-frontend $1 +/usr/local/share/dotnet/dotnet run translate check-backend ../../../.. +/usr/local/share/dotnet/dotnet run translate check-frontend ../../../.. -/usr/local/share/dotnet/dotnet run translate gen-frontend $1 -/usr/local/share/dotnet/dotnet run translate gen-backend $1 \ No newline at end of file +/usr/local/share/dotnet/dotnet run translate gen-frontend ../../../.. +/usr/local/share/dotnet/dotnet run translate gen-backend ../../../.. \ No newline at end of file diff --git a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/AppMutationsGraphType.cs b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/AppMutationsGraphType.cs deleted file mode 100644 index 0da986ba6..000000000 --- a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/AppMutationsGraphType.cs +++ /dev/null @@ -1,344 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschraenkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using GraphQL; -using GraphQL.Resolvers; -using GraphQL.Types; -using Newtonsoft.Json.Linq; -using Squidex.Domain.Apps.Core.Contents; -using Squidex.Domain.Apps.Entities.Contents.Commands; -using Squidex.Domain.Apps.Entities.Schemas; -using Squidex.Infrastructure; -using Squidex.Infrastructure.Commands; - -namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types -{ - public sealed class AppMutationsGraphType : ObjectGraphType - { - public AppMutationsGraphType(IGraphModel model, IEnumerable schemas) - { - foreach (var schema in schemas) - { - var schemaId = schema.NamedId(); - var schemaType = schema.TypeName(); - var schemaName = schema.DisplayName(); - - var contentType = model.GetContentType(schema.Id); - var contentDataType = model.GetContentDataType(schema.Id); - - var resultType = new ContentDataChangedResultGraphType(schemaType, schemaName, contentDataType); - - var inputType = new ContentDataGraphInputType(model, schema); - - AddContentCreate(schemaId, schemaType, schemaName, inputType, contentDataType, contentType); - AddContentUpdate(schemaType, schemaName, inputType, resultType); - AddContentPatch(schemaType, schemaName, inputType, resultType); - AddContentPublish(schemaType, schemaName); - AddContentUnpublish(schemaType, schemaName); - AddContentArchive(schemaType, schemaName); - AddContentRestore(schemaType, schemaName); - AddContentDelete(schemaType, schemaName); - } - - Description = "The app mutations."; - } - - private void AddContentCreate(NamedId schemaId, string schemaType, string schemaName, ContentDataGraphInputType inputType, IGraphType contentDataType, IGraphType contentType) - { - AddField(new FieldType - { - Name = $"create{schemaType}Content", - Arguments = new QueryArguments - { - new QueryArgument(AllTypes.None) - { - Name = "data", - Description = $"The data for the {schemaName} content.", - DefaultValue = null, - ResolvedType = new NonNullGraphType(inputType), - }, - new QueryArgument(AllTypes.None) - { - Name = "publish", - Description = "Set to true to autopublish content.", - DefaultValue = false, - ResolvedType = AllTypes.Boolean - }, - new QueryArgument(AllTypes.None) - { - Name = "expectedVersion", - Description = "The expected version", - DefaultValue = EtagVersion.Any, - ResolvedType = AllTypes.Int - } - }, - ResolvedType = new NonNullGraphType(contentType), - Resolver = ResolveAsync(async (c, publish) => - { - var argPublish = c.GetArgument("publish"); - - var contentData = GetContentData(c); - - var command = new CreateContent { SchemaId = schemaId, Data = contentData, Publish = argPublish }; - var commandContext = await publish(command); - - var result = commandContext.Result>(); - var response = ContentEntity.Create(command, result); - - return (IContentEntity)ContentEntity.Create(command, result); - }), - Description = $"Creates an {schemaName} content." - }); - } - - private void AddContentUpdate(string schemaType, string schemaName, ContentDataGraphInputType inputType, IGraphType resultType) - { - AddField(new FieldType - { - Name = $"update{schemaType}Content", - Arguments = new QueryArguments - { - new QueryArgument(AllTypes.None) - { - Name = "id", - Description = $"The id of the {schemaName} content (GUID)", - DefaultValue = string.Empty, - ResolvedType = AllTypes.NonNullGuid - }, - new QueryArgument(AllTypes.None) - { - Name = "data", - Description = $"The data for the {schemaName} content.", - DefaultValue = null, - ResolvedType = new NonNullGraphType(inputType), - }, - new QueryArgument(AllTypes.None) - { - Name = "expectedVersion", - Description = "The expected version", - DefaultValue = EtagVersion.Any, - ResolvedType = AllTypes.Int - } - }, - ResolvedType = new NonNullGraphType(resultType), - Resolver = ResolveAsync(async (c, publish) => - { - var contentId = c.GetArgument("id"); - var contentData = GetContentData(c); - - var command = new UpdateContent { ContentId = contentId, Data = contentData }; - var commandContext = await publish(command); - - var result = commandContext.Result(); - - return result; - }), - Description = $"Update an {schemaName} content by id." - }); - } - - private void AddContentPatch(string schemaType, string schemaName, ContentDataGraphInputType inputType, IGraphType resultType) - { - AddField(new FieldType - { - Name = $"patch{schemaType}Content", - Arguments = new QueryArguments - { - new QueryArgument(AllTypes.None) - { - Name = "id", - Description = $"The id of the {schemaName} content (GUID)", - DefaultValue = string.Empty, - ResolvedType = AllTypes.NonNullGuid - }, - new QueryArgument(AllTypes.None) - { - Name = "data", - Description = $"The data for the {schemaName} content.", - DefaultValue = null, - ResolvedType = new NonNullGraphType(inputType), - }, - new QueryArgument(AllTypes.None) - { - Name = "expectedVersion", - Description = "The expected version", - DefaultValue = EtagVersion.Any, - ResolvedType = AllTypes.Int - } - }, - ResolvedType = new NonNullGraphType(resultType), - Resolver = ResolveAsync(async (c, publish) => - { - var contentId = c.GetArgument("id"); - var contentData = GetContentData(c); - - var command = new PatchContent { ContentId = contentId, Data = contentData }; - var commandContext = await publish(command); - - var result = commandContext.Result(); - - return result; - }), - Description = $"Patch a {schemaName} content." - }); - } - - private void AddContentPublish(string schemaType, string schemaName) - { - AddField(new FieldType - { - Name = $"publish{schemaType}Content", - Arguments = CreateIdArguments(schemaName), - ResolvedType = AllTypes.CommandVersion, - Resolver = ResolveAsync((c, publish) => - { - var contentId = c.GetArgument("id"); - - var command = new ChangeContentStatus { ContentId = contentId, Status = Status.Published }; - - return publish(command); - }), - Description = $"Publish a {schemaName} content." - }); - } - - private void AddContentUnpublish(string schemaType, string schemaName) - { - AddField(new FieldType - { - Name = $"unpublish{schemaType}Content", - Arguments = CreateIdArguments(schemaName), - ResolvedType = AllTypes.CommandVersion, - Resolver = ResolveAsync((c, publish) => - { - var contentId = c.GetArgument("id"); - - var command = new ChangeContentStatus { ContentId = contentId, Status = Status.Draft }; - - return publish(command); - }), - Description = $"Unpublish a {schemaName} content." - }); - } - - private void AddContentArchive(string schemaType, string schemaName) - { - AddField(new FieldType - { - Name = $"archive{schemaType}Content", - Arguments = CreateIdArguments(schemaName), - ResolvedType = AllTypes.CommandVersion, - Resolver = ResolveAsync((c, publish) => - { - var contentId = c.GetArgument("id"); - - var command = new ChangeContentStatus { ContentId = contentId, Status = Status.Archived }; - - return publish(command); - }), - Description = $"Archive a {schemaName} content." - }); - } - - private void AddContentRestore(string schemaType, string schemaName) - { - AddField(new FieldType - { - Name = $"restore{schemaType}Content", - Arguments = CreateIdArguments(schemaName), - ResolvedType = AllTypes.CommandVersion, - Resolver = ResolveAsync((c, publish) => - { - var contentId = c.GetArgument("id"); - - var command = new ChangeContentStatus { ContentId = contentId, Status = Status.Draft }; - - return publish(command); - }), - Description = $"Restore a {schemaName} content." - }); - } - - private void AddContentDelete(string schemaType, string schemaName) - { - AddField(new FieldType - { - Name = $"delete{schemaType}Content", - Arguments = CreateIdArguments(schemaName), - ResolvedType = AllTypes.CommandVersion, - Resolver = ResolveAsync((c, publish) => - { - var contentId = c.GetArgument("id"); - - var command = new DeleteContent { ContentId = contentId }; - - return publish(command); - }), - Description = $"Delete an {schemaName} content." - }); - } - - private static QueryArguments CreateIdArguments(string schemaName) - { - return new QueryArguments - { - new QueryArgument(AllTypes.None) - { - Name = "id", - Description = $"The id of the {schemaName} content (GUID)", - DefaultValue = string.Empty, - ResolvedType = AllTypes.NonNullGuid - }, - new QueryArgument(AllTypes.None) - { - Name = "expectedVersion", - Description = "The expected version", - DefaultValue = EtagVersion.Any, - ResolvedType = AllTypes.Int - } - }; - } - - private static IFieldResolver ResolveAsync(Func>, Task> action) - { - return new FuncFieldResolver>(async c => - { - var e = (GraphQLExecutionContext)c.UserContext; - - try - { - return await action(c, command => - { - command.ExpectedVersion = c.GetArgument("expectedVersion", EtagVersion.Any); - - return e.CommandBus.PublishAsync(command); - }); - } - catch (ValidationException ex) - { - c.Errors.Add(new ExecutionError(ex.Message)); - - throw; - } - catch (DomainException ex) - { - c.Errors.Add(new ExecutionError(ex.Message)); - - throw; - } - }); - } - - private static NamedContentData GetContentData(ResolveFieldContext c) - { - return JObject.FromObject(c.GetArgument("data")).ToObject(); - } - } -} diff --git a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentDataGraphInputType.cs b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentDataGraphInputType.cs deleted file mode 100644 index 0186366a9..000000000 --- a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentDataGraphInputType.cs +++ /dev/null @@ -1,70 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschränkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using System.Linq; -using GraphQL.Types; -using Squidex.Domain.Apps.Entities.Schemas; -using Squidex.Infrastructure; - -namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types -{ - public sealed class ContentDataGraphInputType : InputObjectGraphType - { - public ContentDataGraphInputType(IGraphModel model, ISchemaEntity schema) - { - var schemaType = schema.TypeName(); - var schemaName = schema.DisplayName(); - - Name = $"{schemaType}InputDto"; - - foreach (var field in schema.SchemaDef.Fields.Where(x => !x.IsHidden)) - { - var inputType = model.GetInputGraphType(field); - - if (inputType != null) - { - if (field.RawProperties.IsRequired) - { - inputType = new NonNullGraphType(inputType); - } - - var fieldName = field.RawProperties.Label.WithFallback(field.Name); - - var fieldGraphType = new InputObjectGraphType - { - Name = $"{schemaType}Data{field.Name.ToPascalCase()}InputDto" - }; - - var partition = model.ResolvePartition(field.Partitioning); - - foreach (var partitionItem in partition) - { - fieldGraphType.AddField(new FieldType - { - Name = partitionItem.Key, - Resolver = null, - ResolvedType = inputType, - Description = field.RawProperties.Hints - }); - } - - fieldGraphType.Description = $"The input structure of the {fieldName} of a {schemaName} content type."; - - AddField(new FieldType - { - Name = field.Name.ToCamelCase(), - Resolver = null, - ResolvedType = fieldGraphType, - Description = $"The {fieldName} field." - }); - } - } - - Description = $"The structure of a {schemaName} content type."; - } - } -} diff --git a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/GeolocationInputGraphType.cs b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/GeolocationInputGraphType.cs deleted file mode 100644 index 73ba49b5c..000000000 --- a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/GeolocationInputGraphType.cs +++ /dev/null @@ -1,31 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschraenkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using GraphQL.Types; - -namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types -{ - public sealed class GeolocationInputGraphType : InputObjectGraphType - { - public GeolocationInputGraphType() - { - Name = "GeolocationInputDto"; - - AddField(new FieldType - { - Name = "latitude", - ResolvedType = AllTypes.NonNullFloat - }); - - AddField(new FieldType - { - Name = "longitude", - ResolvedType = AllTypes.NonNullFloat - }); - } - } -} diff --git a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/InputFieldExtensions.cs b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/InputFieldExtensions.cs deleted file mode 100644 index 84af9a8f0..000000000 --- a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/InputFieldExtensions.cs +++ /dev/null @@ -1,20 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschraenkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using GraphQL.Types; -using Squidex.Domain.Apps.Core.Schemas; - -namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types -{ - public static class InputFieldExtensions - { - public static IGraphType GetInputGraphType(this IField field) - { - return field.Accept(InputFieldVisitor.Default); - } - } -} diff --git a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/InputFieldVisitor.cs b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/InputFieldVisitor.cs deleted file mode 100644 index e000e13e5..000000000 --- a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/InputFieldVisitor.cs +++ /dev/null @@ -1,71 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschraenkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using GraphQL.Types; -using Squidex.Domain.Apps.Core.Schemas; - -namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types -{ - public sealed class InputFieldVisitor : IFieldVisitor - { - public static readonly InputFieldVisitor Default = new InputFieldVisitor(); - - private InputFieldVisitor() - { - } - - public IGraphType Visit(IArrayField field) - { - return AllTypes.NoopArray; - } - - public IGraphType Visit(IField field) - { - return AllTypes.References; - } - - public IGraphType Visit(IField field) - { - return AllTypes.Boolean; - } - - public IGraphType Visit(IField field) - { - return AllTypes.Date; - } - - public IGraphType Visit(IField field) - { - return AllTypes.GeolocationInput; - } - - public IGraphType Visit(IField field) - { - return AllTypes.Json; - } - - public IGraphType Visit(IField field) - { - return AllTypes.Float; - } - - public IGraphType Visit(IField field) - { - return AllTypes.References; - } - - public IGraphType Visit(IField field) - { - return AllTypes.String; - } - - public IGraphType Visit(IField field) - { - return AllTypes.Tags; - } - } -} diff --git a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/NestedInputGraphType.cs b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/NestedInputGraphType.cs deleted file mode 100644 index 44434370d..000000000 --- a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/NestedInputGraphType.cs +++ /dev/null @@ -1,47 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschraenkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using System.Linq; -using GraphQL.Types; -using Squidex.Domain.Apps.Core.Schemas; -using Squidex.Domain.Apps.Entities.Schemas; -using Squidex.Infrastructure; - -namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types -{ - public sealed class NestedInputGraphType : InputObjectGraphType - { - public NestedInputGraphType(IGraphModel model, ISchemaEntity schema, IArrayField field) - { - var schemaType = schema.TypeName(); - var schemaName = schema.DisplayName(); - - var fieldType = field.TypeName(); - var fieldName = field.DisplayName(); - - Name = $"{schemaType}{fieldName}ChildDto"; - - foreach (var nestedField in field.Fields.Where(x => !x.IsHidden)) - { - var fieldInfo = model.GetGraphType(schema, nestedField); - - if (fieldInfo.ResolveType != null) - { - AddField(new FieldType - { - Name = nestedField.Name.ToCamelCase(), - Resolver = null, - ResolvedType = fieldInfo.ResolveType, - Description = $"The {fieldName}/{nestedField.DisplayName()} nested field." - }); - } - } - - Description = $"The structure of a {schemaName}.{fieldName} nested schema."; - } - } -} From 2a47c9ef2c0199403c7973b428611f74521a9a08 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 15 Sep 2020 23:30:29 +0200 Subject: [PATCH 13/21] Some more tests. --- ...flowConverter.cs => WorkflowsConverter.cs} | 2 +- .../HandleRules/EventEnricher.cs | 5 +- .../Config/Domain/SerializationServices.cs | 2 +- .../Model/Contents/WorkflowJsonTests.cs | 22 +++ .../Model/Contents/WorkflowsJsonTests.cs | 17 +- .../HandleRules/EventEnricherTests.cs | 153 ++++++++++++++++++ .../TestHelpers/TestUtils.cs | 2 +- 7 files changed, 185 insertions(+), 18 deletions(-) rename backend/src/Squidex.Domain.Apps.Core.Model/Contents/Json/{WorkflowConverter.cs => WorkflowsConverter.cs} (93%) create mode 100644 backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/EventEnricherTests.cs diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/Json/WorkflowConverter.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/Json/WorkflowsConverter.cs similarity index 93% rename from backend/src/Squidex.Domain.Apps.Core.Model/Contents/Json/WorkflowConverter.cs rename to backend/src/Squidex.Domain.Apps.Core.Model/Contents/Json/WorkflowsConverter.cs index a5c8d14b4..03acd02c3 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/Json/WorkflowConverter.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/Json/WorkflowsConverter.cs @@ -12,7 +12,7 @@ using Squidex.Infrastructure.Json.Newtonsoft; namespace Squidex.Domain.Apps.Core.Contents.Json { - public sealed class WorkflowConverter : JsonClassConverter + public sealed class WorkflowsConverter : JsonClassConverter { protected override void WriteValue(JsonWriter writer, Workflows value, JsonSerializer serializer) { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EventEnricher.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EventEnricher.cs index fde694065..fbddaf977 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EventEnricher.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EventEnricher.cs @@ -42,7 +42,10 @@ namespace Squidex.Domain.Apps.Core.HandleRules userEvent.Actor = squidexEvent.Actor; } - userEvent.User = await FindUserAsync(userEvent.Actor); + if (userEvent.Actor != null) + { + userEvent.User = await FindUserAsync(userEvent.Actor); + } } enrichedEvent.AppId = @event.Payload.AppId; diff --git a/backend/src/Squidex/Config/Domain/SerializationServices.cs b/backend/src/Squidex/Config/Domain/SerializationServices.cs index 9d74defdf..0543e944c 100644 --- a/backend/src/Squidex/Config/Domain/SerializationServices.cs +++ b/backend/src/Squidex/Config/Domain/SerializationServices.cs @@ -52,7 +52,7 @@ namespace Squidex.Config.Domain new SchemaConverter(), new StatusConverter(), new StringEnumConverter(), - new WorkflowConverter(), + new WorkflowsConverter(), new WorkflowStepConverter()); settings.NullValueHandling = NullValueHandling.Ignore; diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/WorkflowJsonTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/WorkflowJsonTests.cs index 1864b0a5a..5ece0290d 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/WorkflowJsonTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/WorkflowJsonTests.cs @@ -5,6 +5,8 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== +using System; +using System.Collections.Generic; using System.Linq; using FluentAssertions; using Squidex.Domain.Apps.Core.Contents; @@ -18,6 +20,26 @@ namespace Squidex.Domain.Apps.Core.Model.Contents { [Fact] public void Should_serialize_and_deserialize() + { + var workflow = new Workflow( + Status.Draft, new Dictionary + { + [Status.Draft] = new WorkflowStep( + new Dictionary + { + [Status.Published] = WorkflowTransition.When("Expression", "Role1", "Role2") + }, + "#00ff00", + NoUpdate.When("Expression", "Role1", "Role2")) + }, new List { Guid.NewGuid() }, "MyName"); + + var serialized = workflow.SerializeAndDeserialize(); + + serialized.Should().BeEquivalentTo(workflow); + } + + [Fact] + public void Should_serialize_and_deserialize_default() { var workflow = Workflow.Default; diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/WorkflowsJsonTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/WorkflowsJsonTests.cs index 6d2e796ae..a774bb1ae 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/WorkflowsJsonTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/WorkflowsJsonTests.cs @@ -6,7 +6,6 @@ // ========================================================================== using System; -using System.Collections.Generic; using FluentAssertions; using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.TestHelpers; @@ -19,21 +18,11 @@ namespace Squidex.Domain.Apps.Core.Model.Contents [Fact] public void Should_serialize_and_deserialize() { - var workflow = new Workflow( - Status.Draft, new Dictionary - { - [Status.Draft] = new WorkflowStep( - new Dictionary - { - [Status.Published] = WorkflowTransition.When("Expression", "Role1", "Role2") - }, - "#00ff00", - NoUpdate.When("Expression", "Role1", "Role2")) - }, new List { Guid.NewGuid() }, "MyName"); + var workflows = Workflows.Empty.Add(Guid.NewGuid(), "my-workflow"); - var serialized = workflow.SerializeAndDeserialize(); + var serialized = workflows.SerializeAndDeserialize(); - serialized.Should().BeEquivalentTo(workflow); + serialized.Should().BeEquivalentTo(workflows); } } } diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/EventEnricherTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/EventEnricherTests.cs new file mode 100644 index 000000000..ba4d8e119 --- /dev/null +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/EventEnricherTests.cs @@ -0,0 +1,153 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using System.Threading.Tasks; +using FakeItEasy; +using Microsoft.Extensions.Caching.Memory; +using Microsoft.Extensions.Options; +using NodaTime; +using Squidex.Domain.Apps.Core.HandleRules; +using Squidex.Domain.Apps.Core.Rules.EnrichedEvents; +using Squidex.Domain.Apps.Events; +using Squidex.Domain.Apps.Events.Contents; +using Squidex.Infrastructure; +using Squidex.Infrastructure.EventSourcing; +using Squidex.Shared.Users; +using Xunit; + +namespace Squidex.Domain.Apps.Core.Operations.HandleRules +{ + public class EventEnricherTests + { + private readonly IUserResolver userResolver = A.Fake(); + private readonly EventEnricher sut; + + public EventEnricherTests() + { + var cache = new MemoryCache(Options.Create(new MemoryCacheOptions())); + + sut = new EventEnricher(cache, userResolver); + } + + [Fact] + public async Task Should_enrich_with_timestamp() + { + var timestamp = SystemClock.Instance.GetCurrentInstant().WithoutMs(); + + var @event = + Envelope.Create(new ContentCreated()) + .SetTimestamp(timestamp); + + var enrichedEvent = new EnrichedContentEvent(); + + await sut.EnrichAsync(enrichedEvent, @event); + + Assert.Equal(timestamp, enrichedEvent.Timestamp); + } + + [Fact] + public async Task Should_enrich_with_appId() + { + var appId = NamedId.Of(Guid.NewGuid(), "my-app"); + + var @event = + Envelope.Create(new ContentCreated + { + AppId = appId + }); + + var enrichedEvent = new EnrichedContentEvent(); + + await sut.EnrichAsync(enrichedEvent, @event); + + Assert.Equal(appId, enrichedEvent.AppId); + } + + [Fact] + public async Task Should_not_enrich_with_user_if_token_is_null() + { + RefToken actor = null!; + + var @event = + Envelope.Create(new ContentCreated + { + Actor = actor + }); + + var enrichedEvent = new EnrichedContentEvent(); + + await sut.EnrichAsync(enrichedEvent, @event); + + Assert.Null(enrichedEvent.User); + + A.CallTo(() => userResolver.FindByIdAsync(A._)) + .MustNotHaveHappened(); + } + + [Fact] + public async Task Should_enrich_with_user() + { + var actor = new RefToken(RefTokenType.Client, "me"); + + var user = A.Dummy(); + + A.CallTo(() => userResolver.FindByIdAsync(actor.Identifier)) + .Returns(user); + + var @event = + Envelope.Create(new ContentCreated + { + Actor = actor + }); + + var enrichedEvent = new EnrichedContentEvent(); + + await sut.EnrichAsync(enrichedEvent, @event); + + Assert.Equal(user, enrichedEvent.User); + + A.CallTo(() => userResolver.FindByIdAsync(A._)) + .MustHaveHappenedOnceExactly(); + } + + [Fact] + public async Task Should_enrich_with_user_and_cache() + { + var actor = new RefToken(RefTokenType.Client, "me"); + + var user = A.Dummy(); + + A.CallTo(() => userResolver.FindByIdAsync(actor.Identifier)) + .Returns(user); + + var @event1 = + Envelope.Create(new ContentCreated + { + Actor = actor + }); + + var @event2 = + Envelope.Create(new ContentCreated + { + Actor = actor + }); + + var enrichedEvent1 = new EnrichedContentEvent(); + var enrichedEvent2 = new EnrichedContentEvent(); + + await sut.EnrichAsync(enrichedEvent1, @event1); + await sut.EnrichAsync(enrichedEvent2, @event2); + + Assert.Equal(user, enrichedEvent1.User); + Assert.Equal(user, enrichedEvent2.User); + + A.CallTo(() => userResolver.FindByIdAsync(A._)) + .MustHaveHappenedOnceExactly(); + } + } +} diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/TestHelpers/TestUtils.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/TestHelpers/TestUtils.cs index 39e254264..c1a506196 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/TestHelpers/TestUtils.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/TestHelpers/TestUtils.cs @@ -64,7 +64,7 @@ namespace Squidex.Domain.Apps.Core.TestHelpers new SchemaConverter(), new StatusConverter(), new StringEnumConverter(), - new WorkflowConverter(), + new WorkflowsConverter(), new WorkflowStepConverter()), TypeNameHandling = typeNameHandling From d5c58760d14d1b566ab8c23bbcf5a30b2a2911b3 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Wed, 16 Sep 2020 13:40:57 +0200 Subject: [PATCH 14/21] Fix empty filter. --- frontend/app/shared/state/query.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/app/shared/state/query.ts b/frontend/app/shared/state/query.ts index e63b4cd1d..79c0cfb4a 100644 --- a/frontend/app/shared/state/query.ts +++ b/frontend/app/shared/state/query.ts @@ -219,7 +219,7 @@ const StringOperators: ReadonlyArray = [ ]; const ArrayOperators: ReadonlyArray = [ - { name: 'i18n:common.queryOperators.empty', value: 'is empty', noValue: true } + { name: 'i18n:common.queryOperators.empty', value: 'empty', noValue: true } ]; const TypeBoolean: QueryFieldModel = { From ed15466c81780ae32f3eedc947df40eb73168444 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Wed, 16 Sep 2020 15:58:48 +0200 Subject: [PATCH 15/21] Better default config. --- backend/src/Squidex/appsettings.json | 6 +++--- .../Model/Apps/LanguagesConfigTests.cs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/src/Squidex/appsettings.json b/backend/src/Squidex/appsettings.json index e7e7d5f6d..ac96050d3 100644 --- a/backend/src/Squidex/appsettings.json +++ b/backend/src/Squidex/appsettings.json @@ -37,9 +37,9 @@ "strongETag": false, /* - * Restrict the surrogate keys to 17KB. + * Restrict the surrogate keys to the number of characters. */ - "maxSurrogateKeysSize": 8000, + "maxSurrogateKeysSize": 0, "replicated": { /* @@ -51,7 +51,7 @@ "languages": { /* - * Use custom langauges where the key is the language code and the value is the english name. + * Use custom languages where the key is the language code and the value is the english name. */ "custom": "" }, diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Apps/LanguagesConfigTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Apps/LanguagesConfigTests.cs index 7d07724a5..8c8007b2c 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Apps/LanguagesConfigTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Model/Apps/LanguagesConfigTests.cs @@ -203,7 +203,7 @@ namespace Squidex.Domain.Apps.Core.Model.Apps } [Fact] - public void Should_same_langauges_if_removing_single_language() + public void Should_same_languages_if_removing_single_language() { var config_1 = config_0.Remove(Language.EN); From 3c732f8d9b0ee65eed9f2d2338e36c490f455485 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Wed, 16 Sep 2020 17:12:37 +0200 Subject: [PATCH 16/21] Algolia fixes. --- .../Actions/Algolia/AlgoliaAction.cs | 4 ++ .../Actions/Algolia/AlgoliaActionHandler.cs | 17 ++++--- .../ElasticSearch/ElasticSearchAction.cs | 9 ++++ .../ElasticSearchActionHandler.cs | 45 +++++++++++++++---- .../Actions/{HttpHelper.cs => RuleHelper.cs} | 32 ++++++++++++- 5 files changed, 91 insertions(+), 16 deletions(-) rename backend/extensions/Squidex.Extensions/Actions/{HttpHelper.cs => RuleHelper.cs} (60%) diff --git a/backend/extensions/Squidex.Extensions/Actions/Algolia/AlgoliaAction.cs b/backend/extensions/Squidex.Extensions/Actions/Algolia/AlgoliaAction.cs index bcd2efd83..261470ee6 100644 --- a/backend/extensions/Squidex.Extensions/Actions/Algolia/AlgoliaAction.cs +++ b/backend/extensions/Squidex.Extensions/Actions/Algolia/AlgoliaAction.cs @@ -43,5 +43,9 @@ namespace Squidex.Extensions.Actions.Algolia [DataType(DataType.MultilineText)] [Formattable] public string Document { get; set; } + + [Display(Name = "Deletion", Description = "The condition when to delete the entry.")] + [DataType(DataType.Text)] + public string Delete { get; set; } } } diff --git a/backend/extensions/Squidex.Extensions/Actions/Algolia/AlgoliaActionHandler.cs b/backend/extensions/Squidex.Extensions/Actions/Algolia/AlgoliaActionHandler.cs index 442738af0..0eb38e08e 100644 --- a/backend/extensions/Squidex.Extensions/Actions/Algolia/AlgoliaActionHandler.cs +++ b/backend/extensions/Squidex.Extensions/Actions/Algolia/AlgoliaActionHandler.cs @@ -13,6 +13,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.Rules.EnrichedEvents; +using Squidex.Domain.Apps.Core.Scripting; #pragma warning disable IDE0059 // Value assigned to symbol is never used @@ -21,8 +22,9 @@ namespace Squidex.Extensions.Actions.Algolia public sealed class AlgoliaActionHandler : RuleActionHandler { private readonly ClientPool<(string AppId, string ApiKey, string IndexName), ISearchIndex> clients; + private readonly IScriptEngine scriptEngine; - public AlgoliaActionHandler(RuleEventFormatter formatter) + public AlgoliaActionHandler(RuleEventFormatter formatter, IScriptEngine scriptEngine) : base(formatter) { clients = new ClientPool<(string AppId, string ApiKey, string IndexName), ISearchIndex>(key => @@ -31,13 +33,17 @@ namespace Squidex.Extensions.Actions.Algolia return client.InitIndex(key.IndexName); }); + + this.scriptEngine = scriptEngine; } protected override async Task<(string Description, AlgoliaJob Data)> CreateJobAsync(EnrichedEvent @event, AlgoliaAction action) { - if (@event is EnrichedContentEvent contentEvent) + if (@event is IEnrichedEntityEvent entityEvent) { - var contentId = contentEvent.Id.ToString(); + var delete = @event.ShouldDelete(scriptEngine, action.Delete); + + var contentId = entityEvent.Id.ToString(); var ruleDescription = string.Empty; var ruleJob = new AlgoliaJob @@ -48,8 +54,7 @@ namespace Squidex.Extensions.Actions.Algolia IndexName = await FormatAsync(action.IndexName, @event) }; - if (contentEvent.Type == EnrichedContentEventType.Deleted || - contentEvent.Type == EnrichedContentEventType.Unpublished) + if (delete) { ruleDescription = $"Delete entry from Algolia index: {action.IndexName}"; } @@ -69,7 +74,7 @@ namespace Squidex.Extensions.Actions.Algolia } else { - jsonString = ToJson(contentEvent); + jsonString = ToJson(@event); } json = JObject.Parse(jsonString); diff --git a/backend/extensions/Squidex.Extensions/Actions/ElasticSearch/ElasticSearchAction.cs b/backend/extensions/Squidex.Extensions/Actions/ElasticSearch/ElasticSearchAction.cs index 115f6ea77..c0fc24bd0 100644 --- a/backend/extensions/Squidex.Extensions/Actions/ElasticSearch/ElasticSearchAction.cs +++ b/backend/extensions/Squidex.Extensions/Actions/ElasticSearch/ElasticSearchAction.cs @@ -41,5 +41,14 @@ namespace Squidex.Extensions.Actions.ElasticSearch [Display(Name = "Password", Description = "The optional password.")] [DataType(DataType.Text)] public string Password { get; set; } + + [Display(Name = "Document", Description = "The optional custom document.")] + [DataType(DataType.MultilineText)] + [Formattable] + public string Document { get; set; } + + [Display(Name = "Deletion", Description = "The condition when to delete the document.")] + [DataType(DataType.Text)] + public string Delete { get; set; } } } diff --git a/backend/extensions/Squidex.Extensions/Actions/ElasticSearch/ElasticSearchActionHandler.cs b/backend/extensions/Squidex.Extensions/Actions/ElasticSearch/ElasticSearchActionHandler.cs index a1c0e6363..9b7f167fa 100644 --- a/backend/extensions/Squidex.Extensions/Actions/ElasticSearch/ElasticSearchActionHandler.cs +++ b/backend/extensions/Squidex.Extensions/Actions/ElasticSearch/ElasticSearchActionHandler.cs @@ -9,8 +9,10 @@ using System; using System.Threading; using System.Threading.Tasks; using Elasticsearch.Net; +using Newtonsoft.Json.Linq; using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.Rules.EnrichedEvents; +using Squidex.Domain.Apps.Core.Scripting; #pragma warning disable IDE0059 // Value assigned to symbol is never used @@ -19,8 +21,9 @@ namespace Squidex.Extensions.Actions.ElasticSearch public sealed class ElasticSearchActionHandler : RuleActionHandler { private readonly ClientPool<(Uri Host, string Username, string Password), ElasticLowLevelClient> clients; + private readonly IScriptEngine scriptEngine; - public ElasticSearchActionHandler(RuleEventFormatter formatter) + public ElasticSearchActionHandler(RuleEventFormatter formatter, IScriptEngine scriptEngine) : base(formatter) { clients = new ClientPool<(Uri Host, string Username, string Password), ElasticLowLevelClient>(key => @@ -34,16 +37,19 @@ namespace Squidex.Extensions.Actions.ElasticSearch return new ElasticLowLevelClient(config); }); + + this.scriptEngine = scriptEngine; } protected override async Task<(string Description, ElasticSearchJob Data)> CreateJobAsync(EnrichedEvent @event, ElasticSearchAction action) { - if (@event is EnrichedContentEvent contentEvent) + if (@event is IEnrichedEntityEvent entityEvent) { - var contentId = contentEvent.Id.ToString(); + var delete = @event.ShouldDelete(scriptEngine, action.Delete); - var ruleDescription = string.Empty; + var contentId = entityEvent.Id.ToString(); + var ruleDescription = string.Empty; var ruleJob = new ElasticSearchJob { IndexName = await FormatAsync(action.IndexName, @event), @@ -53,8 +59,7 @@ namespace Squidex.Extensions.Actions.ElasticSearch ContentId = contentId }; - if (contentEvent.Type == EnrichedContentEventType.Deleted || - contentEvent.Type == EnrichedContentEventType.Unpublished) + if (delete) { ruleDescription = $"Delete entry index: {action.IndexName}"; } @@ -62,9 +67,31 @@ namespace Squidex.Extensions.Actions.ElasticSearch { ruleDescription = $"Upsert to index: {action.IndexName}"; - var json = ToJson(contentEvent); - - ruleJob.Content = $"{{ \"objectId\": \"{contentId}\", {json.Substring(1)}"; + JObject json; + try + { + string jsonString; + + if (!string.IsNullOrEmpty(action.Document)) + { + jsonString = await FormatAsync(action.Document, @event); + jsonString = jsonString?.Trim(); + } + else + { + jsonString = ToJson(@event); + } + + json = JObject.Parse(jsonString); + } + catch (Exception ex) + { + json = new JObject(new JProperty("error", $"Invalid JSON: {ex.Message}")); + } + + json.AddFirst(new JProperty("contentId", contentId)); + + ruleJob.Content = json.ToString(); } return (ruleDescription, ruleJob); diff --git a/backend/extensions/Squidex.Extensions/Actions/HttpHelper.cs b/backend/extensions/Squidex.Extensions/Actions/RuleHelper.cs similarity index 60% rename from backend/extensions/Squidex.Extensions/Actions/HttpHelper.cs rename to backend/extensions/Squidex.Extensions/Actions/RuleHelper.cs index cc1bdfe69..1869638ea 100644 --- a/backend/extensions/Squidex.Extensions/Actions/HttpHelper.cs +++ b/backend/extensions/Squidex.Extensions/Actions/RuleHelper.cs @@ -10,12 +10,42 @@ using System.Net.Http; using System.Threading; using System.Threading.Tasks; using Squidex.Domain.Apps.Core.HandleRules; +using Squidex.Domain.Apps.Core.Rules.EnrichedEvents; +using Squidex.Domain.Apps.Core.Scripting; using Squidex.Infrastructure.Http; namespace Squidex.Extensions.Actions { - public static class HttpHelper + public static class RuleHelper { + public static bool ShouldDelete(this EnrichedEvent @event, IScriptEngine scriptEngine, string? expression) + { + if (!string.IsNullOrWhiteSpace(expression)) + { + var vars = new ScriptVars + { + ["event"] = @event + }; + + return scriptEngine.Evaluate(vars, expression); + } + + return IsContentDeletion(@event) || IsAssetDeletion(@event); + } + + public static bool IsContentDeletion(this EnrichedEvent @event) + { + return @event is EnrichedContentEvent contentEvent && + (contentEvent.Type == EnrichedContentEventType.Deleted || + contentEvent.Type == EnrichedContentEventType.Unpublished); + } + + public static bool IsAssetDeletion(this EnrichedEvent @event) + { + return @event is EnrichedAssetEvent assetEvent && + (assetEvent.Type == EnrichedAssetEventType.Deleted); + } + public static async Task OneWayRequestAsync(this HttpClient client, HttpRequestMessage request, string requestBody = null, CancellationToken ct = default) { HttpResponseMessage response = null; From 9b3d66d81e885e70ed98c7e439929f5bb0c21c59 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Thu, 17 Sep 2020 10:47:07 +0200 Subject: [PATCH 17/21] NL translation fix. --- backend/i18n/frontend_nl.json | 2 +- backend/i18n/source/frontend_nl.json | 2 +- .../features/content/shared/forms/assets-editor.component.scss | 1 + .../content/shared/references/references-editor.component.scss | 3 ++- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/backend/i18n/frontend_nl.json b/backend/i18n/frontend_nl.json index 34a0ddfa3..616f42838 100644 --- a/backend/i18n/frontend_nl.json +++ b/backend/i18n/frontend_nl.json @@ -380,7 +380,7 @@ "contents.referencesCreatePublish": "Maken en publiceren", "contents.referencesLink": "Link geselecteerde inhoud ({count})", "contents.referencesSelectExisting": "Selecteer bestaande", - "contents.referencesSelectSchema": "Selecteer {scheme}", + "contents.referencesSelectSchema": "Selecteer {schema}", "contents.refreshTooltip": "Ververs inhoud (CTRL + SHIFT + R)", "contents.reloaded": "Inhoud opnieuw geladen.", "contents.removeConfirmText": "Wil je de inhoud echt verwijderen?", diff --git a/backend/i18n/source/frontend_nl.json b/backend/i18n/source/frontend_nl.json index 5fb1e6b6a..e4265bf6c 100644 --- a/backend/i18n/source/frontend_nl.json +++ b/backend/i18n/source/frontend_nl.json @@ -368,7 +368,7 @@ "contents.referencesCreatePublish": "Maken en publiceren", "contents.referencesLink": "Link geselecteerde inhoud ({count})", "contents.referencesSelectExisting": "Selecteer bestaande", - "contents.referencesSelectSchema": "Selecteer {scheme}", + "contents.referencesSelectSchema": "Selecteer {schema}", "contents.refreshTooltip": "Ververs inhoud (CTRL + SHIFT + R)", "contents.reloaded": "Inhoud opnieuw geladen.", "contents.removeConfirmText": "Wil je de inhoud echt verwijderen?", diff --git a/frontend/app/features/content/shared/forms/assets-editor.component.scss b/frontend/app/features/content/shared/forms/assets-editor.component.scss index 86fc2ead1..c03af5383 100644 --- a/frontend/app/features/content/shared/forms/assets-editor.component.scss +++ b/frontend/app/features/content/shared/forms/assets-editor.component.scss @@ -40,6 +40,7 @@ font-weight: normal; padding: 5px .5rem; text-align: center; + text-decoration: none; transition: border-color .4s ease; } diff --git a/frontend/app/features/content/shared/references/references-editor.component.scss b/frontend/app/features/content/shared/references/references-editor.component.scss index 93e444171..be7e74deb 100644 --- a/frontend/app/features/content/shared/references/references-editor.component.scss +++ b/frontend/app/features/content/shared/references/references-editor.component.scss @@ -25,10 +25,11 @@ border: 2px dashed darken($color-border, 10%); color: darken($color-border, 30%); cursor: pointer; - font-size: 1.2rem; + font-size: 1rem; font-weight: normal; padding: 1rem; text-align: center; + text-decoration: none; transition: border-color .4s ease; } From 67ac64efad36d98582cefcd59db2ab1370a71022 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Thu, 17 Sep 2020 11:10:51 +0200 Subject: [PATCH 18/21] Revert the updateOn strategy. --- frontend/app/shared/state/contents.forms.ts | 12 ++-- .../shared/state/contents.forms.visitors.ts | 62 ------------------- 2 files changed, 5 insertions(+), 69 deletions(-) diff --git a/frontend/app/shared/state/contents.forms.ts b/frontend/app/shared/state/contents.forms.ts index 68d4102f3..4f7d14a83 100644 --- a/frontend/app/shared/state/contents.forms.ts +++ b/frontend/app/shared/state/contents.forms.ts @@ -15,7 +15,7 @@ import { LanguageDto } from './../services/languages.service'; import { FieldDto, NestedFieldDto, RootFieldDto, SchemaDetailsDto, TableField } from './../services/schemas.service'; import { fieldInvariant } from './../services/schemas.types'; import { CompiledRule, FieldSection, Hidden, PartitionConfig } from './contents.forms-helpers'; -import { FieldDefaultValue, FieldsValidators, FieldUpdateOn } from './contents.forms.visitors'; +import { FieldDefaultValue, FieldsValidators } from './contents.forms.visitors'; export { FieldSection } from './contents.forms-helpers'; @@ -48,7 +48,7 @@ export class PatchContentForm extends Form { for (const field of this.editableFields) { const validators = FieldsValidators.create(field, this.language.isOptional); - this.form.setControl(field.name, new FormControl(undefined, { updateOn: FieldUpdateOn.get(field), validators })); + this.form.setControl(field.name, new FormControl(undefined, { validators })); } } @@ -86,9 +86,7 @@ export class EditContentForm extends Form { constructor(languages: ReadonlyArray, schema: SchemaDetailsDto, private readonly user: any = {} ) { - super(new FormGroup({}, { - updateOn: 'blur' - })); + super(new FormGroup({})); const compiledPartitions = new PartitionConfig(languages); const compiledConditions = schema.fieldRules.map(x => new CompiledRule(x)); @@ -339,7 +337,7 @@ export class FieldValueForm extends AbstractContentForm { return null; } - public visitUI(_: UIFieldPropertiesDto): any { - return null; - } -} - -type UpdateOn = 'change' | 'blur'; - -export class FieldUpdateOn implements FieldPropertiesVisitor { - private static INSTANCE = new FieldUpdateOn(); - - private constructor( - ) { - } - - public static get(field: FieldDto): UpdateOn { - if (field.properties.editorUrl) { - return 'change'; - } - - return field.properties.accept(FieldUpdateOn.INSTANCE); - } - - public visitDateTime(_: DateTimeFieldPropertiesDto): any { - return 'blur'; - } - - public visitArray(_: ArrayFieldPropertiesDto): any { - return 'blur'; - } - - public visitAssets(_: AssetsFieldPropertiesDto): any { - return 'blur'; - } - - public visitBoolean(_: BooleanFieldPropertiesDto): any { - return 'change'; - } - - public visitGeolocation(_: GeolocationFieldPropertiesDto): any { - return 'blur'; - } - - public visitJson(_: JsonFieldPropertiesDto): any { - return 'blur'; - } - - public visitNumber(properties: NumberFieldPropertiesDto): any { - return properties.editor === 'Radio' || properties.editor === 'Dropdown' ? 'change' : 'blur'; - } - - public visitReferences(properties: ReferencesFieldPropertiesDto): any { - return properties.editor === 'Dropdown' || properties.editor === 'Checkboxes' ? 'change' : 'blur'; - } - - public visitString(properties: StringFieldPropertiesDto): any { - return properties.editor === 'Radio' || properties.editor === 'Dropdown' ? 'change' : 'blur'; - } - - public visitTags(properties: TagsFieldPropertiesDto): any { - return properties.editor === 'Checkboxes' || properties.editor === 'Dropdown' ? 'change' : 'blur'; - } - public visitUI(_: UIFieldPropertiesDto): any { return null; } From d84b28be20b9c4a0c0d7bab4bba63e2da698f6b1 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Thu, 17 Sep 2020 11:15:21 +0200 Subject: [PATCH 19/21] Styling fixes. --- .../app/framework/angular/forms/form-error.component.html | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frontend/app/framework/angular/forms/form-error.component.html b/frontend/app/framework/angular/forms/form-error.component.html index 163f49baa..e0d27e879 100644 --- a/frontend/app/framework/angular/forms/form-error.component.html +++ b/frontend/app/framework/angular/forms/form-error.component.html @@ -1,9 +1,10 @@
- + - + +
From c653a9a70c7cdc5606560f3b20f98549f2cab421 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Thu, 17 Sep 2020 15:23:02 +0200 Subject: [PATCH 20/21] Fix anonymous access. --- .../Assets/Queries/AssetQueryParser.cs | 4 +++- .../Contents/Queries/ContentQueryParser.cs | 5 +++++ .../Controllers/Contents/ContentsController.cs | 16 ++++++++-------- frontend/app/theme/_forms.scss | 3 ++- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/backend/src/Squidex.Domain.Apps.Entities/Assets/Queries/AssetQueryParser.cs b/backend/src/Squidex.Domain.Apps.Entities/Assets/Queries/AssetQueryParser.cs index ed2670c3c..174077c85 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Assets/Queries/AssetQueryParser.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Assets/Queries/AssetQueryParser.cs @@ -40,13 +40,15 @@ namespace Squidex.Domain.Apps.Entities.Assets.Queries Guard.NotNull(tagService, nameof(tagService)); this.jsonSerializer = jsonSerializer; - this.options = options.Value; this.tagService = tagService; + + this.options = options.Value; } public virtual async ValueTask ParseQueryAsync(Context context, Q q) { Guard.NotNull(context, nameof(context)); + Guard.NotNull(q, nameof(q)); using (Profiler.TraceMethod()) { diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/ContentQueryParser.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/ContentQueryParser.cs index 7ef86ba06..48f404124 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/ContentQueryParser.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/ContentQueryParser.cs @@ -42,7 +42,11 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries public ContentQueryParser(IMemoryCache cache, IJsonSerializer jsonSerializer, IOptions options) : base(cache) { + Guard.NotNull(jsonSerializer, nameof(jsonSerializer)); + Guard.NotNull(options, nameof(options)); + this.jsonSerializer = jsonSerializer; + this.options = options.Value; } @@ -50,6 +54,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries { Guard.NotNull(context, nameof(context)); Guard.NotNull(schema, nameof(schema)); + Guard.NotNull(q, nameof(q)); using (Profiler.TraceMethod()) { diff --git a/backend/src/Squidex/Areas/Api/Controllers/Contents/ContentsController.cs b/backend/src/Squidex/Areas/Api/Controllers/Contents/ContentsController.cs index 65ab2cfaf..0c40ae356 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Contents/ContentsController.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Contents/ContentsController.cs @@ -53,7 +53,7 @@ namespace Squidex.Areas.Api.Controllers.Contents /// [HttpGet] [Route("content/{app}/graphql/")] - [ApiPermission] + [ApiPermissionOrAnonymous] [ApiCosts(2)] public async Task GetGraphQL(string app, [FromQuery] GraphQLGetDto? queries = null) { @@ -85,7 +85,7 @@ namespace Squidex.Areas.Api.Controllers.Contents /// [HttpPost] [Route("content/{app}/graphql/")] - [ApiPermission] + [ApiPermissionOrAnonymous] [ApiCosts(2)] public async Task PostGraphQL(string app, [FromBody] GraphQLPostDto query) { @@ -117,7 +117,7 @@ namespace Squidex.Areas.Api.Controllers.Contents /// [HttpPost] [Route("content/{app}/graphql/batch")] - [ApiPermission] + [ApiPermissionOrAnonymous] [ApiCosts(2)] public async Task PostGraphQLBatch(string app, [FromBody] GraphQLPostDto[] batch) { @@ -150,7 +150,7 @@ namespace Squidex.Areas.Api.Controllers.Contents [HttpGet] [Route("content/{app}/")] [ProducesResponseType(typeof(ContentsDto), 200)] - [ApiPermission] + [ApiPermissionOrAnonymous] [ApiCosts(1)] public async Task GetAllContents(string app, [FromQuery] string ids) { @@ -179,7 +179,7 @@ namespace Squidex.Areas.Api.Controllers.Contents [HttpPost] [Route("content/{app}/")] [ProducesResponseType(typeof(ContentsDto), 200)] - [ApiPermission] + [ApiPermissionOrAnonymous] [ApiCosts(1)] public async Task GetAllContentsPost(string app, [FromBody] ContentsIdsQueryDto query) { @@ -210,7 +210,7 @@ namespace Squidex.Areas.Api.Controllers.Contents [HttpGet] [Route("content/{app}/{name}/")] [ProducesResponseType(typeof(ContentsDto), 200)] - [ApiPermission] + [ApiPermissionOrAnonymous] [ApiCosts(1)] public async Task GetContents(string app, string name, [FromQuery] string? ids = null, [FromQuery] string? q = null) { @@ -242,7 +242,7 @@ namespace Squidex.Areas.Api.Controllers.Contents [HttpPost] [Route("content/{app}/{name}/query")] [ProducesResponseType(typeof(ContentsDto), 200)] - [ApiPermission] + [ApiPermissionOrAnonymous] [ApiCosts(1)] public async Task GetContentsPost(string app, string name, [FromBody] QueryDto query) { @@ -274,7 +274,7 @@ namespace Squidex.Areas.Api.Controllers.Contents [HttpGet] [Route("content/{app}/{name}/{id}/")] [ProducesResponseType(typeof(ContentsDto), 200)] - [ApiPermission] + [ApiPermissionOrAnonymous] [ApiCosts(1)] public async Task GetContent(string app, string name, Guid id) { diff --git a/frontend/app/theme/_forms.scss b/frontend/app/theme/_forms.scss index 19c2aaa53..4dc1570b9 100644 --- a/frontend/app/theme/_forms.scss +++ b/frontend/app/theme/_forms.scss @@ -117,8 +117,9 @@ .form-alert { @include absolute(.25rem, 0, auto, auto); - font-size: 1rem; + font-size: .9rem; font-weight: normal; + line-height: 1.75; max-width: 600px; min-width: 200px; padding: 1rem; From 03b6d65bdb3e97a490cf5e3b7956d3e9cd6fed51 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Thu, 17 Sep 2020 15:25:08 +0200 Subject: [PATCH 21/21] Build fix. --- .drone.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.drone.yml b/.drone.yml index 3ff23d5a4..262c708ff 100644 --- a/.drone.yml +++ b/.drone.yml @@ -111,6 +111,7 @@ steps: - push branch: - master + - release/* - name: push_release image: docker