diff --git a/FilterLists.sln.DotSettings b/FilterLists.sln.DotSettings index f9f61ccb5..92175e8b2 100644 --- a/FilterLists.sln.DotSettings +++ b/FilterLists.sln.DotSettings @@ -8,8 +8,10 @@ SOLUTION ECMAScript 2015 Built-in: Full Cleanup + ExpressionBody ExpressionBody True + False CHOP_IF_LONG <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> diff --git a/data/FilterList.json b/data/FilterList.json index 8a6636c3e..43e8512ed 100644 --- a/data/FilterList.json +++ b/data/FilterList.json @@ -2837,7 +2837,8 @@ { "id": 148, "chatUrl": null, - "description": "I make supplemental filters in Adblock Plus to block garbage on webpages not blocked by other lists. I use many regular expressions, a few domain filters, but no CSS filters.", + "description": + "I make supplemental filters in Adblock Plus to block garbage on webpages not blocked by other lists. I use many regular expressions, a few domain filters, but no CSS filters.", "descriptionSourceUrl": "https://satterly.neocities.org/abp_filters.html", "discontinuedDate": null, "donateUrl": null, @@ -3343,7 +3344,8 @@ { "id": 174, "chatUrl": null, - "description": "Blockzilla is an optimized and slim list. Light on system resources yet still powerful against ads and trackers.", + "description": + "Blockzilla is an optimized and slim list. Light on system resources yet still powerful against ads and trackers.", "descriptionSourceUrl": "https://github.com/zpacman/Blockzilla", "discontinuedDate": null, "donateUrl": null, @@ -8257,12 +8259,14 @@ "publishedDate": null, "submissionUrl": null, "syntaxId": 1, - "viewUrl": "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/NorwegianExperimentalList%20alternate%20versions/AdawayHosts" + "viewUrl": + "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/NorwegianExperimentalList%20alternate%20versions/AdawayHosts" }, { "id": 431, "chatUrl": null, - "description": "Have you ever felt bothered by how many websites still think that everyone are using narrow monitors? Well, here's how to stretch them out like a piece of gum!", + "description": + "Have you ever felt bothered by how many websites still think that everyone are using narrow monitors? Well, here's how to stretch them out like a piece of gum!", "descriptionSourceUrl": null, "discontinuedDate": null, "donateUrl": "https://sproutsluckycorner.wordpress.com/2017/11/14/my-work-and-contact-resume/#donations", @@ -8276,6 +8280,7 @@ "publishedDate": null, "submissionUrl": null, "syntaxId": 4, - "viewUrl": "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/Dandelion%20Sprout's%20Website%20Stretcher.txt" + "viewUrl": + "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/Dandelion%20Sprout's%20Website%20Stretcher.txt" } -] +] \ No newline at end of file diff --git a/data/FilterListLanguage.json b/data/FilterListLanguage.json index 3888c7737..89dd033fb 100644 --- a/data/FilterListLanguage.json +++ b/data/FilterListLanguage.json @@ -671,4 +671,4 @@ "filterListID": 430, "languageId": 44 } -] +] \ No newline at end of file diff --git a/data/FilterListMaintainer.json b/data/FilterListMaintainer.json index 150f32eac..e70137ff4 100644 --- a/data/FilterListMaintainer.json +++ b/data/FilterListMaintainer.json @@ -719,4 +719,4 @@ "filterListId": 430, "maintainerId": 22 } -] +] \ No newline at end of file diff --git a/data/Software.json b/data/Software.json index 3267bad23..bcccb9f52 100644 --- a/data/Software.json +++ b/data/Software.json @@ -43,7 +43,8 @@ }, { "id": 8, - "downloadUrl": "https://chrome.google.com/webstore/detail/personal-blocklist-by-goo/nolijncfnkgaikbjbdaogikpmpbdcdef", + "downloadUrl": + "https://chrome.google.com/webstore/detail/personal-blocklist-by-goo/nolijncfnkgaikbjbdaogikpmpbdcdef", "homeUrl": "https://chrome.google.com/webstore/detail/personal-blocklist-by-goo/nolijncfnkgaikbjbdaogikpmpbdcdef", "name": "Personal Blocklist (Chrome)" }, @@ -71,4 +72,4 @@ "homeUrl": "https://github.com/2ndalpha/gasmask", "name": "Gas Mask" } -] +] \ No newline at end of file diff --git a/data/SoftwareSyntax.json b/data/SoftwareSyntax.json index de74b2ceb..38f8a2a91 100644 --- a/data/SoftwareSyntax.json +++ b/data/SoftwareSyntax.json @@ -47,4 +47,4 @@ "softwareId": 12, "syntaxId": 1 } -] +] \ No newline at end of file diff --git a/src/FilterLists.Agent/Program.cs b/src/FilterLists.Agent/Program.cs index adeb5d8fb..e215ddd4e 100644 --- a/src/FilterLists.Agent/Program.cs +++ b/src/FilterLists.Agent/Program.cs @@ -25,13 +25,11 @@ public static void Main() CaptureSnapshots(BatchSize); } - private static void BuildConfigurationRoot() - { + private static void BuildConfigurationRoot() => configurationRoot = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", true) .Build(); - } private static void InstantiateTelemetryClient() { @@ -42,7 +40,7 @@ private static void InstantiateTelemetryClient() private static void BuildServiceProvider() { var serviceCollection = new ServiceCollection(); - serviceCollection.AddFilterListsServices(configurationRoot); + serviceCollection.AddFilterListsAgentServices(configurationRoot); serviceProvider = serviceCollection.BuildServiceProvider(); } diff --git a/src/FilterLists.Api/DependencyInjection/Extensions/ConfigureServicesCollection.cs b/src/FilterLists.Api/DependencyInjection/Extensions/ConfigureServicesCollection.cs index 9f90bab67..bbb244100 100644 --- a/src/FilterLists.Api/DependencyInjection/Extensions/ConfigureServicesCollection.cs +++ b/src/FilterLists.Api/DependencyInjection/Extensions/ConfigureServicesCollection.cs @@ -22,27 +22,20 @@ public static void AddFilterListsApi(this IServiceCollection services) TelemetryDebugWriter.IsTracingDisabled = true; } - private static void ConfigureCookiePolicy(this IServiceCollection services) - { + private static void ConfigureCookiePolicy(this IServiceCollection services) => services.Configure(opts => { opts.CheckConsentNeeded = context => true; opts.MinimumSameSitePolicy = SameSiteMode.None; }); - } - private static void AddMvcCustom(this IServiceCollection services) - { + private static void AddMvcCustom(this IServiceCollection services) => services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); - } - private static void AddRoutingCustom(this IServiceCollection services) - { + private static void AddRoutingCustom(this IServiceCollection services) => services.AddRouting(opts => opts.LowercaseUrls = true); - } - private static void AddSwaggerGenCustom(this IServiceCollection services) - { + private static void AddSwaggerGenCustom(this IServiceCollection services) => services.AddSwaggerGen(opts => { opts.SwaggerDoc("v1", @@ -54,11 +47,12 @@ private static void AddSwaggerGenCustom(this IServiceCollection services) "A REST-ish API for FilterLists, the independent, comprehensive directory of all public filter and hosts lists for advertisements, trackers, malware, and annoyances." + Environment.NewLine + " - {version} has to be specified manually (to \"1\") in Swagger playground below due to https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/370", - Contact = new Contact - { - Url = "https://github.com/collinbarrett/FilterLists/", - Name = "FilterLists - GitHub" - }, + Contact = + new Contact + { + Url = "https://github.com/collinbarrett/FilterLists/", + Name = "FilterLists - GitHub" + }, License = new License { Name = "MIT License", @@ -68,6 +62,5 @@ private static void AddSwaggerGenCustom(this IServiceCollection services) opts.IncludeXmlComments(Path.Combine(PlatformServices.Default.Application.ApplicationBasePath, "FilterLists.Api.xml")); }); - } } } \ No newline at end of file diff --git a/src/FilterLists.Api/Program.cs b/src/FilterLists.Api/Program.cs index e7adfec6b..08be01525 100644 --- a/src/FilterLists.Api/Program.cs +++ b/src/FilterLists.Api/Program.cs @@ -5,10 +5,7 @@ namespace FilterLists.Api { public static class Program { - public static void Main(string[] args) - { - CreateWebHostBuilder(args).Build().Run(); - } + public static void Main(string[] args) => CreateWebHostBuilder(args).Build().Run(); private static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) diff --git a/src/FilterLists.Api/Startup.cs b/src/FilterLists.Api/Startup.cs index f163d6f1b..9e3cd5d2a 100644 --- a/src/FilterLists.Api/Startup.cs +++ b/src/FilterLists.Api/Startup.cs @@ -17,17 +17,14 @@ namespace FilterLists.Api [UsedImplicitly] public class Startup { - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } + public Startup(IConfiguration configuration) => Configuration = configuration; private IConfiguration Configuration { get; } [UsedImplicitly] public void ConfigureServices(IServiceCollection services) { - services.AddFilterListsServices(Configuration); + services.AddFilterListsApiServices(Configuration); services.AddFilterListsApi(); } @@ -72,16 +69,13 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env) } //TODO: remove hack (https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/74#issuecomment-386762178) - private static void UseLowercaseControllerNameInSwaggerHack(SwaggerOptions opts) - { + private static void UseLowercaseControllerNameInSwaggerHack(SwaggerOptions opts) => opts.PreSerializeFilters.Add((document, request) => { var paths = document.Paths.ToDictionary(item => item.Key.ToLowerInvariant(), item => item.Value); document.Paths.Clear(); - foreach (var pathItem in paths) - document.Paths.Add(pathItem.Key, pathItem.Value); + foreach (var pathItem in paths) document.Paths.Add(pathItem.Key, pathItem.Value); }); - } private void MigrateAndSeedDatabase(IApplicationBuilder app) { diff --git a/src/FilterLists.Api/V1/Controllers/BaseController.cs b/src/FilterLists.Api/V1/Controllers/BaseController.cs index de44247ed..ff2f3ad3e 100644 --- a/src/FilterLists.Api/V1/Controllers/BaseController.cs +++ b/src/FilterLists.Api/V1/Controllers/BaseController.cs @@ -14,9 +14,6 @@ public BaseController() { } - protected BaseController(SeedService seedService) - { - SeedService = seedService; - } + protected BaseController(SeedService seedService) => SeedService = seedService; } } \ No newline at end of file diff --git a/src/FilterLists.Api/V1/Controllers/ListsController.cs b/src/FilterLists.Api/V1/Controllers/ListsController.cs index 01d8b3d8c..4d7c40841 100644 --- a/src/FilterLists.Api/V1/Controllers/ListsController.cs +++ b/src/FilterLists.Api/V1/Controllers/ListsController.cs @@ -11,10 +11,8 @@ public class ListsController : BaseController { private readonly FilterListService filterListService; - public ListsController(SeedService seedService, FilterListService filterListService) : base(seedService) - { + public ListsController(SeedService seedService, FilterListService filterListService) : base(seedService) => this.filterListService = filterListService; - } [HttpGet] public async Task Index() => Json(await filterListService.GetAllSummariesAsync()); diff --git a/src/FilterLists.Api/V1/Controllers/ListsMaintainersController.cs b/src/FilterLists.Api/V1/Controllers/ListsMaintainersController.cs index 5c0fc88e7..4d8e43169 100644 --- a/src/FilterLists.Api/V1/Controllers/ListsMaintainersController.cs +++ b/src/FilterLists.Api/V1/Controllers/ListsMaintainersController.cs @@ -13,8 +13,8 @@ public ListsMaintainersController(SeedService seedService) : base(seedService) } [HttpGet("seed")] - public async Task Seed() => Json( - await SeedService.GetAllAsync( + public async Task Seed() => + Json(await SeedService.GetAllAsync( typeof(FilterListMaintainer).GetProperty("MaintainerId"), typeof(FilterListMaintainer).GetProperty("FilterListId"))); } diff --git a/src/FilterLists.Api/V1/Controllers/RulesController.cs b/src/FilterLists.Api/V1/Controllers/RulesController.cs index fb1cb8e37..9c37fbafa 100644 --- a/src/FilterLists.Api/V1/Controllers/RulesController.cs +++ b/src/FilterLists.Api/V1/Controllers/RulesController.cs @@ -8,10 +8,7 @@ public class RulesController : BaseController { private readonly RuleService ruleService; - public RulesController(RuleService ruleService) - { - this.ruleService = ruleService; - } + public RulesController(RuleService ruleService) => this.ruleService = ruleService; [HttpGet] public async Task Index() => Json(await ruleService.GetCountAll()); diff --git a/src/FilterLists.Data/EntityTypeConfigurations/Junctions/BaseJunctionTypeConfiguration.cs b/src/FilterLists.Data/EntityTypeConfigurations/Junctions/BaseJunctionTypeConfiguration.cs index a162c3237..42697a2ef 100644 --- a/src/FilterLists.Data/EntityTypeConfigurations/Junctions/BaseJunctionTypeConfiguration.cs +++ b/src/FilterLists.Data/EntityTypeConfigurations/Junctions/BaseJunctionTypeConfiguration.cs @@ -7,11 +7,7 @@ namespace FilterLists.Data.EntityTypeConfigurations.Junctions public class BaseJunctionTypeConfiguration : IEntityTypeConfiguration where TJunction : BaseJunctionEntity { - public virtual void Configure(EntityTypeBuilder entityTypeBuilder) - { - entityTypeBuilder.Property(x => x.CreatedDateUtc) - .HasColumnType("TIMESTAMP") - .ValueGeneratedOnAdd(); - } + public virtual void Configure(EntityTypeBuilder entityTypeBuilder) => + entityTypeBuilder.Property(x => x.CreatedDateUtc).HasColumnType("TIMESTAMP").ValueGeneratedOnAdd(); } } \ No newline at end of file diff --git a/src/FilterLists.Data/Seed/Extensions/SeedFilterListsDbContext.cs b/src/FilterLists.Data/Seed/Extensions/SeedFilterListsDbContext.cs index a25e57a13..d797d48aa 100644 --- a/src/FilterLists.Data/Seed/Extensions/SeedFilterListsDbContext.cs +++ b/src/FilterLists.Data/Seed/Extensions/SeedFilterListsDbContext.cs @@ -42,21 +42,17 @@ private static void InsertOnDuplicateKeyUpdate(this DbContext dbContext dbContext.SaveChanges(); } - private static List GetPropertiesLessValueGeneratedTimestamps(IEntityType entityType) - { - //TODO: get seed properties dynamically from JSON - return entityType.GetProperties() - .Where(x => !new List {"CreatedDateUtc", "ModifiedDateUtc"}.Contains(x.Name)) - .ToList(); - } + //TODO: get seed properties dynamically from JSON + private static List GetPropertiesLessValueGeneratedTimestamps(IEntityType entityType) => + entityType.GetProperties() + .Where(x => !new List {"CreatedDateUtc", "ModifiedDateUtc"}.Contains(x.Name)) + .ToList(); private static string CreateValues(IReadOnlyCollection properties, string dataPath) - where TEntity : IBaseEntity - { - return GetSeedRows(dataPath) - .Select(row => CreateRowValues(properties, row)) - .Aggregate("", (current, rowValues) => current == "" ? rowValues : current + ", " + rowValues); - } + where TEntity : IBaseEntity => + GetSeedRows(dataPath) + .Select(row => CreateRowValues(properties, row)) + .Aggregate("", (current, rowValues) => current == "" ? rowValues : current + ", " + rowValues); private static List GetSeedRows(string dataPath) where TEntity : IBaseEntity { @@ -73,13 +69,11 @@ private static List GetSeedRows(string dataPath) where TEntity } private static string CreateRowValues(IEnumerable properties, TEntity row) - where TEntity : IBaseEntity - { - return (from property in properties - let value = row.GetType().GetProperty(property.Name)?.GetValue(row) - select FormatDataForMySql(property, value)).Aggregate("", - (rowValues, value) => rowValues == "" ? "(" + value : rowValues + ", " + value) + ")"; - } + where TEntity : IBaseEntity => + (from property in properties + let value = row.GetType().GetProperty(property.Name)?.GetValue(row) + select FormatDataForMySql(property, value)).Aggregate("", + (rowValues, value) => rowValues == "" ? "(" + value : rowValues + ", " + value) + ")"; private static object FormatDataForMySql(IProperty property, object value) { @@ -89,7 +83,7 @@ private static object FormatDataForMySql(IProperty property, object value) if (property.ClrType == typeof(bool)) return Convert.ToInt32(value); if (property.ClrType == typeof(DateTime?)) - return "'" + ((DateTime) value).ToString("yyyy-MM-dd HH:mm:ss") + "'"; + return "'" + ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss") + "'"; return value; } @@ -100,7 +94,8 @@ private static string CreateUpdates(IReadOnlyCollection properties) where !property.IsPrimaryKey() select property.Name + " = VALUES(" + property.Name + ")").Aggregate("", (updates, columnUpdates) => updates == "" ? columnUpdates : updates + ", " + columnUpdates); - if (update == "") update = GetUpdateUnchangedColumnHack(properties); + if (update == "") + update = GetUpdateUnchangedColumnHack(properties); return update; } diff --git a/src/FilterLists.Services/DependencyInjection/Extensions/ConfigureServicesCollection.cs b/src/FilterLists.Services/DependencyInjection/Extensions/ConfigureServicesCollection.cs index 1fd53f48f..778dac7d9 100644 --- a/src/FilterLists.Services/DependencyInjection/Extensions/ConfigureServicesCollection.cs +++ b/src/FilterLists.Services/DependencyInjection/Extensions/ConfigureServicesCollection.cs @@ -12,7 +12,21 @@ namespace FilterLists.Services.DependencyInjection.Extensions { public static class ConfigureServicesCollection { - public static void AddFilterListsServices(this IServiceCollection services, IConfiguration config) + public static void AddFilterListsApiServices(this IServiceCollection services, IConfiguration config) + { + services.AddSingleton(c => config); + services.AddEntityFrameworkMySql() + .AddDbContextPool(opts => + opts.UseMySql(config.GetConnectionString("FilterListsConnection"), + x => x.MigrationsAssembly("FilterLists.Api")) + .EnableSensitiveDataLogging()); + services.TryAddScoped(); + services.TryAddScoped(); + services.TryAddScoped(); + services.AddAutoMapper(); + } + + public static void AddFilterListsAgentServices(this IServiceCollection services, IConfiguration config) { services.AddSingleton(c => config); services.AddEntityFrameworkMySql() @@ -21,9 +35,6 @@ public static void AddFilterListsServices(this IServiceCollection services, ICon x => x.MigrationsAssembly("FilterLists.Api")) .EnableSensitiveDataLogging()); services.TryAddScoped(); - services.TryAddScoped(); - services.TryAddScoped(); - services.TryAddScoped(); services.AddAutoMapper(); } } diff --git a/src/FilterLists.Services/FilterList/FilterListService.cs b/src/FilterLists.Services/FilterList/FilterListService.cs index 42b2d8ca7..97b1a5771 100644 --- a/src/FilterLists.Services/FilterList/FilterListService.cs +++ b/src/FilterLists.Services/FilterList/FilterListService.cs @@ -5,6 +5,7 @@ using AutoMapper; using AutoMapper.QueryableExtensions; using FilterLists.Data; +using FilterLists.Services.FilterList.Models; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore; @@ -43,15 +44,13 @@ await DbContext.FilterLists.OrderBy(l => l.Name) .ProjectTo(Mapper.ConfigurationProvider) .ToListAsync(); - private async Task> GetLatestSnapshots() - { - return await DbContext.Snapshots.AsNoTracking() - .Where(s => s.IsCompleted && s.HttpStatusCode == "200" && - (s.AddedSnapshotRules.Count > 0 || s.RemovedSnapshotRules.Count > 0)) - .GroupBy(s => s.FilterListId, - (key, x) => x.OrderByDescending(y => y.CreatedDateUtc).First()) - .ToListAsync(); - } + private async Task> GetLatestSnapshots() => + await DbContext.Snapshots.AsNoTracking() + .Where(s => s.IsCompleted && s.HttpStatusCode == "200" && + (s.AddedSnapshotRules.Count > 0 || s.RemovedSnapshotRules.Count > 0)) + .GroupBy(s => s.FilterListId, + (key, x) => x.OrderByDescending(y => y.CreatedDateUtc).First()) + .ToListAsync(); public async Task GetDetailsAsync(uint id) { diff --git a/src/FilterLists.Services/FilterList/FilterListServiceExtensions.cs b/src/FilterLists.Services/FilterList/FilterListServiceExtensions.cs index ec304a758..56a097c17 100644 --- a/src/FilterLists.Services/FilterList/FilterListServiceExtensions.cs +++ b/src/FilterLists.Services/FilterList/FilterListServiceExtensions.cs @@ -1,5 +1,6 @@ using System.Linq; using System.Threading.Tasks; +using FilterLists.Services.FilterList.Models; namespace FilterLists.Services.FilterList { diff --git a/src/FilterLists.Services/FilterList/MappingProfiles.cs b/src/FilterLists.Services/FilterList/MappingProfiles.cs index 53dd9160a..2ae33602c 100644 --- a/src/FilterLists.Services/FilterList/MappingProfiles.cs +++ b/src/FilterLists.Services/FilterList/MappingProfiles.cs @@ -1,6 +1,7 @@ using System.Linq; using AutoMapper; using FilterLists.Data.Entities; +using FilterLists.Services.FilterList.Models; namespace FilterLists.Services.FilterList { diff --git a/src/FilterLists.Services/FilterList/ListDetailsDto.cs b/src/FilterLists.Services/FilterList/Models/ListDetailsDto.cs similarity index 96% rename from src/FilterLists.Services/FilterList/ListDetailsDto.cs rename to src/FilterLists.Services/FilterList/Models/ListDetailsDto.cs index 2ebfa3d11..050d51700 100644 --- a/src/FilterLists.Services/FilterList/ListDetailsDto.cs +++ b/src/FilterLists.Services/FilterList/Models/ListDetailsDto.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using JetBrains.Annotations; -namespace FilterLists.Services.FilterList +namespace FilterLists.Services.FilterList.Models { [UsedImplicitly] public class ListDetailsDto diff --git a/src/FilterLists.Services/FilterList/ListLanguagesDto.cs b/src/FilterLists.Services/FilterList/Models/ListLanguagesDto.cs similarity index 79% rename from src/FilterLists.Services/FilterList/ListLanguagesDto.cs rename to src/FilterLists.Services/FilterList/Models/ListLanguagesDto.cs index 2be827218..547cd3181 100644 --- a/src/FilterLists.Services/FilterList/ListLanguagesDto.cs +++ b/src/FilterLists.Services/FilterList/Models/ListLanguagesDto.cs @@ -1,6 +1,6 @@ using JetBrains.Annotations; -namespace FilterLists.Services.FilterList +namespace FilterLists.Services.FilterList.Models { [UsedImplicitly] public class ListLanguagesDto diff --git a/src/FilterLists.Services/FilterList/ListLicenseDto.cs b/src/FilterLists.Services/FilterList/Models/ListLicenseDto.cs similarity index 79% rename from src/FilterLists.Services/FilterList/ListLicenseDto.cs rename to src/FilterLists.Services/FilterList/Models/ListLicenseDto.cs index 9fb1a3072..d051cba00 100644 --- a/src/FilterLists.Services/FilterList/ListLicenseDto.cs +++ b/src/FilterLists.Services/FilterList/Models/ListLicenseDto.cs @@ -1,6 +1,6 @@ using JetBrains.Annotations; -namespace FilterLists.Services.FilterList +namespace FilterLists.Services.FilterList.Models { [UsedImplicitly] public class ListLicenseDto diff --git a/src/FilterLists.Services/FilterList/ListMaintainerDto.cs b/src/FilterLists.Services/FilterList/Models/ListMaintainerDto.cs similarity index 90% rename from src/FilterLists.Services/FilterList/ListMaintainerDto.cs rename to src/FilterLists.Services/FilterList/Models/ListMaintainerDto.cs index 784b0b3ed..f0e3f9290 100644 --- a/src/FilterLists.Services/FilterList/ListMaintainerDto.cs +++ b/src/FilterLists.Services/FilterList/Models/ListMaintainerDto.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using JetBrains.Annotations; -namespace FilterLists.Services.FilterList +namespace FilterLists.Services.FilterList.Models { [UsedImplicitly] public class ListMaintainerDto diff --git a/src/FilterLists.Services/FilterList/ListSummaryDto.cs b/src/FilterLists.Services/FilterList/Models/ListSummaryDto.cs similarity index 89% rename from src/FilterLists.Services/FilterList/ListSummaryDto.cs rename to src/FilterLists.Services/FilterList/Models/ListSummaryDto.cs index 24cea5554..6825a76c7 100644 --- a/src/FilterLists.Services/FilterList/ListSummaryDto.cs +++ b/src/FilterLists.Services/FilterList/Models/ListSummaryDto.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using JetBrains.Annotations; -namespace FilterLists.Services.FilterList +namespace FilterLists.Services.FilterList.Models { [UsedImplicitly] public class ListSummaryDto diff --git a/src/FilterLists.Services/FilterList/ListSyntaxDto.cs b/src/FilterLists.Services/FilterList/Models/ListSyntaxDto.cs similarity index 86% rename from src/FilterLists.Services/FilterList/ListSyntaxDto.cs rename to src/FilterLists.Services/FilterList/Models/ListSyntaxDto.cs index 6bd6067c5..9254b0cc6 100644 --- a/src/FilterLists.Services/FilterList/ListSyntaxDto.cs +++ b/src/FilterLists.Services/FilterList/Models/ListSyntaxDto.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using JetBrains.Annotations; -namespace FilterLists.Services.FilterList +namespace FilterLists.Services.FilterList.Models { [UsedImplicitly] public class ListSyntaxDto diff --git a/src/FilterLists.Services/FilterList/MaintainerAdditionalListsDto.cs b/src/FilterLists.Services/FilterList/Models/MaintainerAdditionalListsDto.cs similarity index 79% rename from src/FilterLists.Services/FilterList/MaintainerAdditionalListsDto.cs rename to src/FilterLists.Services/FilterList/Models/MaintainerAdditionalListsDto.cs index f544bcdfa..d515df60e 100644 --- a/src/FilterLists.Services/FilterList/MaintainerAdditionalListsDto.cs +++ b/src/FilterLists.Services/FilterList/Models/MaintainerAdditionalListsDto.cs @@ -1,6 +1,6 @@ using JetBrains.Annotations; -namespace FilterLists.Services.FilterList +namespace FilterLists.Services.FilterList.Models { [UsedImplicitly] public class MaintainerAdditionalListsDto diff --git a/src/FilterLists.Services/FilterList/SyntaxSupportedSoftwareDto.cs b/src/FilterLists.Services/FilterList/Models/SyntaxSupportedSoftwareDto.cs similarity index 80% rename from src/FilterLists.Services/FilterList/SyntaxSupportedSoftwareDto.cs rename to src/FilterLists.Services/FilterList/Models/SyntaxSupportedSoftwareDto.cs index 7dc00340d..400e6288d 100644 --- a/src/FilterLists.Services/FilterList/SyntaxSupportedSoftwareDto.cs +++ b/src/FilterLists.Services/FilterList/Models/SyntaxSupportedSoftwareDto.cs @@ -1,6 +1,6 @@ using JetBrains.Annotations; -namespace FilterLists.Services.FilterList +namespace FilterLists.Services.FilterList.Models { [UsedImplicitly] public class SyntaxSupportedSoftwareDto diff --git a/src/FilterLists.Services/RuleService.cs b/src/FilterLists.Services/RuleService.cs index b0b456b06..887f0116b 100644 --- a/src/FilterLists.Services/RuleService.cs +++ b/src/FilterLists.Services/RuleService.cs @@ -12,8 +12,7 @@ public RuleService(FilterListsDbContext dbContext) : base(dbContext) { } - public async Task GetCountAll() => await DbContext - .Rules.AsNoTracking() - .CountAsync(); + public async Task GetCountAll() => + await DbContext.Rules.AsNoTracking().CountAsync(); } } \ No newline at end of file diff --git a/src/FilterLists.Services/Seed/SeedService.cs b/src/FilterLists.Services/Seed/SeedService.cs index 168cda1a9..b47b02a5a 100644 --- a/src/FilterLists.Services/Seed/SeedService.cs +++ b/src/FilterLists.Services/Seed/SeedService.cs @@ -21,17 +21,18 @@ public async Task> GetAllAsync() where await DbContext.Set().ProjectTo(Mapper.ConfigurationProvider).ToArrayAsync(); public async Task> GetAllAsync(PropertyInfo primarySort) - where TEntity : class => await DbContext.Set() - .OrderBy(x => primarySort.GetValue(x, null)) - .ProjectTo(Mapper.ConfigurationProvider) - .ToArrayAsync(); + where TEntity : class => + await DbContext.Set() + .OrderBy(x => primarySort.GetValue(x, null)) + .ProjectTo(Mapper.ConfigurationProvider) + .ToArrayAsync(); - public async Task> - GetAllAsync(PropertyInfo primarySort, PropertyInfo secondarySort) - where TEntity : class => await DbContext.Set() - .OrderBy(x => primarySort.GetValue(x, null)) - .ThenBy(x => secondarySort.GetValue(x, null)) - .ProjectTo(Mapper.ConfigurationProvider) - .ToArrayAsync(); + public async Task> GetAllAsync(PropertyInfo primarySort, + PropertyInfo secondarySort) where TEntity : class => + await DbContext.Set() + .OrderBy(x => primarySort.GetValue(x, null)) + .ThenBy(x => secondarySort.GetValue(x, null)) + .ProjectTo(Mapper.ConfigurationProvider) + .ToArrayAsync(); } } \ No newline at end of file diff --git a/src/FilterLists.Services/Service.cs b/src/FilterLists.Services/Service.cs index e981a1de0..95833800f 100644 --- a/src/FilterLists.Services/Service.cs +++ b/src/FilterLists.Services/Service.cs @@ -10,10 +10,7 @@ public class Service protected readonly FilterListsDbContext DbContext; protected readonly IMapper Mapper; - public Service(FilterListsDbContext dbContext) - { - DbContext = dbContext; - } + public Service(FilterListsDbContext dbContext) => DbContext = dbContext; public Service(FilterListsDbContext dbContext, IMapper mapper) { diff --git a/src/FilterLists.Services/Snapshot/FilterListViewUrlDto.cs b/src/FilterLists.Services/Snapshot/Models/FilterListViewUrlDto.cs similarity index 80% rename from src/FilterLists.Services/Snapshot/FilterListViewUrlDto.cs rename to src/FilterLists.Services/Snapshot/Models/FilterListViewUrlDto.cs index e2ec1f47e..19ff0a5a7 100644 --- a/src/FilterLists.Services/Snapshot/FilterListViewUrlDto.cs +++ b/src/FilterLists.Services/Snapshot/Models/FilterListViewUrlDto.cs @@ -1,6 +1,6 @@ using JetBrains.Annotations; -namespace FilterLists.Services.Snapshot +namespace FilterLists.Services.Snapshot.Models { [UsedImplicitly] public class FilterListViewUrlDto diff --git a/src/FilterLists.Services/Snapshot/SnapshotDe.cs b/src/FilterLists.Services/Snapshot/SnapshotDe.cs index 41157d501..ac799bc71 100644 --- a/src/FilterLists.Services/Snapshot/SnapshotDe.cs +++ b/src/FilterLists.Services/Snapshot/SnapshotDe.cs @@ -7,6 +7,7 @@ using FilterLists.Data; using FilterLists.Data.Entities.Junctions; using FilterLists.Services.Extensions; +using FilterLists.Services.Snapshot.Models; namespace FilterLists.Services.Snapshot { @@ -60,7 +61,7 @@ private async Task TryGetContent() } catch (WebException we) { - snapshot.HttpStatusCode = ((int) ((HttpWebResponse) we.Response).StatusCode).ToString(); + snapshot.HttpStatusCode = ((int)((HttpWebResponse)we.Response).StatusCode).ToString(); return null; } catch (Exception) @@ -78,7 +79,7 @@ private async Task GetContent() httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(UserAgentString); using (var httpResponseMessage = await httpClient.GetAsync(list.ViewUrl)) { - snapshot.HttpStatusCode = ((int) httpResponseMessage.StatusCode).ToString(); + snapshot.HttpStatusCode = ((int)httpResponseMessage.StatusCode).ToString(); if (httpResponseMessage.IsSuccessStatusCode) return await httpResponseMessage.Content.ReadAsStringAsync(); } @@ -102,11 +103,9 @@ private static IEnumerable GetRawRules(string content) return new HashSet(rawRules.Where(rr => rr != null)); } - private IEnumerable GetSnapshotBatches(IEnumerable rawRules) - { - return rawRules.GetBatches(BatchSize) - .Select(rawRuleBatch => new SnapshotBatchDe(dbContext, snapshot, rawRuleBatch)); - } + private IEnumerable GetSnapshotBatches(IEnumerable rawRules) => + rawRules.GetBatches(BatchSize) + .Select(rawRuleBatch => new SnapshotBatchDe(dbContext, snapshot, rawRuleBatch)); private static async Task SaveSnapshotBatches(IEnumerable snapshotBatches) { @@ -122,12 +121,10 @@ private async Task DedupSnapshotRules() await dbContext.SaveChangesAsync(); } - private IQueryable GetExistingSnapshotRules() - { - return dbContext.SnapshotRules.Where(sr => + private IQueryable GetExistingSnapshotRules() => + dbContext.SnapshotRules.Where(sr => sr.AddedBySnapshot.FilterListId == list.Id && sr.AddedBySnapshot != snapshot && sr.RemovedBySnapshot == null); - } private void UpdateRemovedSnapshotRules(IQueryable existingSnapshotRules) { diff --git a/src/FilterLists.Services/Snapshot/SnapshotService.cs b/src/FilterLists.Services/Snapshot/SnapshotService.cs index c0c3c0376..2f10236ea 100644 --- a/src/FilterLists.Services/Snapshot/SnapshotService.cs +++ b/src/FilterLists.Services/Snapshot/SnapshotService.cs @@ -1,10 +1,12 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Linq; using System.Threading.Tasks; using AutoMapper; using AutoMapper.QueryableExtensions; using FilterLists.Data; +using FilterLists.Services.Snapshot.Models; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore; @@ -14,7 +16,8 @@ namespace FilterLists.Services.Snapshot public class SnapshotService : Service { //TODO: update algorithm to support non-standard list sizes and formats (#200, #201) - private readonly List ignoreLists = new List {48, 149, 173, 185, 186, 187, 188, 189, 352}; + private static readonly IList IgnoreLists = + new ReadOnlyCollection(new List {48, 149, 173, 185, 186, 187, 188, 189, 352}); public SnapshotService(FilterListsDbContext dbContext, IMapper mapper) : base(dbContext, mapper) { @@ -41,7 +44,7 @@ await DbContext .Where(list => (!list.Snapshots.Any() || list.Snapshots.Select(ss => ss.CreatedDateUtc).OrderByDescending(sscd => sscd).FirstOrDefault() < - DateTime.UtcNow.AddDays(-1)) && !ignoreLists.Contains(list.Id)) + DateTime.UtcNow.AddDays(-1)) && !IgnoreLists.Contains(list.Id)) .OrderBy(list => list.Snapshots.Any()) .ThenBy(list => list.Snapshots.Select(ss => ss.CreatedDateUtc).OrderByDescending(sscd => sscd).FirstOrDefault()) diff --git a/src/FilterLists.Web/ClientApp/boot.tsx b/src/FilterLists.Web/ClientApp/boot.tsx index 57e9143b8..3e6ba3557 100644 --- a/src/FilterLists.Web/ClientApp/boot.tsx +++ b/src/FilterLists.Web/ClientApp/boot.tsx @@ -1,9 +1,10 @@ -import "bootstrap"; import * as React from "react"; import * as ReactDOM from "react-dom"; import { AppContainer } from "react-hot-loader"; import { BrowserRouter } from "react-router-dom"; import * as RoutesModule from "./routes"; +import "bootstrap"; +import "../css/site.css"; let routes = RoutesModule.routes; function renderApp() { diff --git a/src/FilterLists.Web/ClientApp/components/Home.tsx b/src/FilterLists.Web/ClientApp/components/Home.tsx index 240294f15..e9be38b6f 100644 --- a/src/FilterLists.Web/ClientApp/components/Home.tsx +++ b/src/FilterLists.Web/ClientApp/components/Home.tsx @@ -3,7 +3,6 @@ import { RouteComponentProps } from "react-router"; import "isomorphic-fetch"; import ReactTable from "react-table" import "react-table/react-table.css" -import "../css/site.css"; import ListDetails from "./ListDetails"; import * as moment from "moment"; diff --git a/src/FilterLists.Web/Controllers/HomeController.cs b/src/FilterLists.Web/Controllers/HomeController.cs index 24b36aff6..b328f2031 100644 --- a/src/FilterLists.Web/Controllers/HomeController.cs +++ b/src/FilterLists.Web/Controllers/HomeController.cs @@ -5,10 +5,7 @@ namespace FilterLists.Web.Controllers { public class HomeController : Controller { - public IActionResult Index() - { - return View(); - } + public IActionResult Index() => View(); public IActionResult Error() { diff --git a/src/FilterLists.Web/DependencyInjection/Extensions/ConfigureServicesCollection.cs b/src/FilterLists.Web/DependencyInjection/Extensions/ConfigureServicesCollection.cs index 8a53e5220..1918a1926 100644 --- a/src/FilterLists.Web/DependencyInjection/Extensions/ConfigureServicesCollection.cs +++ b/src/FilterLists.Web/DependencyInjection/Extensions/ConfigureServicesCollection.cs @@ -13,18 +13,14 @@ public static void AddFilterListsWeb(this IServiceCollection services) services.AddMvcCustom(); } - private static void ConfigureCookiePolicy(this IServiceCollection services) - { + private static void ConfigureCookiePolicy(this IServiceCollection services) => services.Configure(options => { options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); - } - private static void AddMvcCustom(this IServiceCollection services) - { + private static void AddMvcCustom(this IServiceCollection services) => services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); - } } } \ No newline at end of file diff --git a/src/FilterLists.Web/Program.cs b/src/FilterLists.Web/Program.cs index 04293665d..6eefc54f8 100644 --- a/src/FilterLists.Web/Program.cs +++ b/src/FilterLists.Web/Program.cs @@ -5,14 +5,9 @@ namespace FilterLists.Web { public static class Program { - public static void Main(string[] args) - { - CreateWebHostBuilder(args).Build().Run(); - } + public static void Main(string[] args) => CreateWebHostBuilder(args).Build().Run(); - private static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost - .CreateDefaultBuilder(args) - .UseUrls("http://localhost:5001;") - .UseStartup(); + private static IWebHostBuilder CreateWebHostBuilder(string[] args) => + WebHost.CreateDefaultBuilder(args).UseUrls("http://localhost:5001;").UseStartup(); } } \ No newline at end of file diff --git a/src/FilterLists.Web/Startup.cs b/src/FilterLists.Web/Startup.cs index 2cd204c47..ef69d3297 100644 --- a/src/FilterLists.Web/Startup.cs +++ b/src/FilterLists.Web/Startup.cs @@ -10,11 +10,10 @@ namespace FilterLists.Web [UsedImplicitly] public class Startup { - public void ConfigureServices(IServiceCollection services) - { - services.AddFilterListsWeb(); - } + [UsedImplicitly] + public void ConfigureServices(IServiceCollection services) => services.AddFilterListsWeb(); + [UsedImplicitly] public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) diff --git a/src/FilterLists.Web/Views/Home/Index.cshtml b/src/FilterLists.Web/Views/Home/Index.cshtml index 2584e39a5..d9855738e 100644 --- a/src/FilterLists.Web/Views/Home/Index.cshtml +++ b/src/FilterLists.Web/Views/Home/Index.cshtml @@ -2,6 +2,7 @@ ViewData["Title"] = "Subscriptions for uBlock Origin, Adblock Plus, AdGuard, ..."; }
Loading...
+ @section scripts { } \ No newline at end of file diff --git a/src/FilterLists.Web/Views/Shared/Error.cshtml b/src/FilterLists.Web/Views/Shared/Error.cshtml index 243844945..6c38a0b5a 100644 --- a/src/FilterLists.Web/Views/Shared/Error.cshtml +++ b/src/FilterLists.Web/Views/Shared/Error.cshtml @@ -5,7 +5,7 @@

Error.

An error occurred while processing your request.

-@if (!string.IsNullOrEmpty((string)ViewData["RequestId"])) +@if (!string.IsNullOrEmpty((string) ViewData["RequestId"])) {

Request ID: @ViewData["RequestId"] diff --git a/src/FilterLists.Web/npm-shrinkwrap.json b/src/FilterLists.Web/npm-shrinkwrap.json index de5bf20f5..969d9a05a 100644 --- a/src/FilterLists.Web/npm-shrinkwrap.json +++ b/src/FilterLists.Web/npm-shrinkwrap.json @@ -1712,7 +1712,8 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "integrity": + "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { "is-plain-object": "2.0.4" @@ -3704,7 +3705,8 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "integrity": + "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { "is-plain-object": "2.0.4" @@ -3809,7 +3811,8 @@ "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "integrity": + "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, "readable-stream": { @@ -4376,7 +4379,8 @@ }, "postcss-modules-extract-imports": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz", + "resolved": + "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz", "integrity": "sha1-ZhQOzs447wa/DT41XWm/WdFB6oU=", "dev": true, "requires": { @@ -4439,7 +4443,8 @@ }, "postcss-modules-local-by-default": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "resolved": + "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", "dev": true, "requires": { @@ -4931,7 +4936,8 @@ "prop-types": { "version": "15.6.2", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", - "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "integrity": + "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", "dev": true, "requires": { "loose-envify": "1.3.1", @@ -5762,7 +5768,8 @@ "ajv": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", - "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", + "integrity": + "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", "dev": true, "requires": { "fast-deep-equal": "2.0.1", @@ -5780,13 +5787,15 @@ "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==", + "integrity": + "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "schema-utils": { "version": "0.4.7", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "integrity": + "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", "dev": true, "requires": { "ajv": "6.5.2", @@ -6060,7 +6069,8 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "integrity": + "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true } } @@ -6586,4 +6596,4 @@ } } } -} +} \ No newline at end of file diff --git a/src/FilterLists.Web/package.json b/src/FilterLists.Web/package.json index 6a820532f..71a2226ad 100644 --- a/src/FilterLists.Web/package.json +++ b/src/FilterLists.Web/package.json @@ -37,4 +37,4 @@ "popper.js": "^1.14.4", "react-table": "^6.8.6" } -} +} \ No newline at end of file