From efcfacaa132d569cf8e9d95d750b8fefbad83155 Mon Sep 17 00:00:00 2001 From: Leysan Nigmatullina <86958548+einlied753@users.noreply.github.com> Date: Mon, 18 Oct 2021 12:54:13 +0300 Subject: [PATCH] PT-4720: Create empty module (#1) * feat: Create empty module * Revert "feat: Create empty module" This reverts commit 950a743023350fa9194551ab40c095984719581c. * feat: Create empty module v.2 --- .editorconfig | 103 ++ .nuke | 1 + LICENSE | 12 + VirtoCommerce.GDPR.sln | 52 + docs/media/diagram-db-model.drawio | 1 + docs/media/diagram-db-model.png | Bin 0 -> 19704 bytes src/VirtoCommerce.GDPR.Core/Events/.keep | 0 src/VirtoCommerce.GDPR.Core/Models/.keep | 0 .../ModuleConstants.cs | 61 + .../Notifications/.keep | 0 src/VirtoCommerce.GDPR.Core/Services/.keep | 0 .../VirtoCommerce.GDPR.Core.csproj | 24 + src/VirtoCommerce.GDPR.Data/Caching/.keep | 0 .../ExportImport/.keep | 0 src/VirtoCommerce.GDPR.Data/Handlers/.keep | 0 src/VirtoCommerce.GDPR.Data/Models/.keep | 0 .../DesignTimeDbContextFactory.cs | 17 + .../Repositories/GDPRModuleDbContext.cs | 25 + src/VirtoCommerce.GDPR.Data/Services/.keep | 0 .../VirtoCommerce.GDPR.Data.csproj | 33 + src/VirtoCommerce.GDPR.Web/Content/logo.png | Bin 0 -> 14153 bytes .../Controllers/Api/GDPRModuleController.cs | 24 + .../Localizations/en.GDPR.json | 28 + src/VirtoCommerce.GDPR.Web/Module.cs | 58 + .../Scripts/blades/hello-world.html | 7 + .../Scripts/blades/hello-world.js | 15 + src/VirtoCommerce.GDPR.Web/Scripts/module.js | 42 + .../Scripts/resources/gdpr-api.js | 4 + .../VirtoCommerce.GDPR.Web.csproj | 23 + src/VirtoCommerce.GDPR.Web/module.manifest | 30 + src/VirtoCommerce.GDPR.Web/package-lock.json | 1549 +++++++++++++++++ src/VirtoCommerce.GDPR.Web/package.json | 18 + src/VirtoCommerce.GDPR.Web/webpack.config.js | 44 + tests/VirtoCommerce.GDPR.Tests/Test.cs | 17 + .../VirtoCommerce.GDPR.Tests.csproj | 27 + 35 files changed, 2215 insertions(+) create mode 100644 .editorconfig create mode 100644 .nuke create mode 100644 LICENSE create mode 100644 VirtoCommerce.GDPR.sln create mode 100644 docs/media/diagram-db-model.drawio create mode 100644 docs/media/diagram-db-model.png create mode 100644 src/VirtoCommerce.GDPR.Core/Events/.keep create mode 100644 src/VirtoCommerce.GDPR.Core/Models/.keep create mode 100644 src/VirtoCommerce.GDPR.Core/ModuleConstants.cs create mode 100644 src/VirtoCommerce.GDPR.Core/Notifications/.keep create mode 100644 src/VirtoCommerce.GDPR.Core/Services/.keep create mode 100644 src/VirtoCommerce.GDPR.Core/VirtoCommerce.GDPR.Core.csproj create mode 100644 src/VirtoCommerce.GDPR.Data/Caching/.keep create mode 100644 src/VirtoCommerce.GDPR.Data/ExportImport/.keep create mode 100644 src/VirtoCommerce.GDPR.Data/Handlers/.keep create mode 100644 src/VirtoCommerce.GDPR.Data/Models/.keep create mode 100644 src/VirtoCommerce.GDPR.Data/Repositories/DesignTimeDbContextFactory.cs create mode 100644 src/VirtoCommerce.GDPR.Data/Repositories/GDPRModuleDbContext.cs create mode 100644 src/VirtoCommerce.GDPR.Data/Services/.keep create mode 100644 src/VirtoCommerce.GDPR.Data/VirtoCommerce.GDPR.Data.csproj create mode 100644 src/VirtoCommerce.GDPR.Web/Content/logo.png create mode 100644 src/VirtoCommerce.GDPR.Web/Controllers/Api/GDPRModuleController.cs create mode 100644 src/VirtoCommerce.GDPR.Web/Localizations/en.GDPR.json create mode 100644 src/VirtoCommerce.GDPR.Web/Module.cs create mode 100644 src/VirtoCommerce.GDPR.Web/Scripts/blades/hello-world.html create mode 100644 src/VirtoCommerce.GDPR.Web/Scripts/blades/hello-world.js create mode 100644 src/VirtoCommerce.GDPR.Web/Scripts/module.js create mode 100644 src/VirtoCommerce.GDPR.Web/Scripts/resources/gdpr-api.js create mode 100644 src/VirtoCommerce.GDPR.Web/VirtoCommerce.GDPR.Web.csproj create mode 100644 src/VirtoCommerce.GDPR.Web/module.manifest create mode 100644 src/VirtoCommerce.GDPR.Web/package-lock.json create mode 100644 src/VirtoCommerce.GDPR.Web/package.json create mode 100644 src/VirtoCommerce.GDPR.Web/webpack.config.js create mode 100644 tests/VirtoCommerce.GDPR.Tests/Test.cs create mode 100644 tests/VirtoCommerce.GDPR.Tests/VirtoCommerce.GDPR.Tests.csproj diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..be95936 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,103 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 4 +end_of_line = crlf +trim_trailing_whitespace = true +insert_final_newline = true + +# Project files +[*.csproj] +indent_size = 2 +insert_final_newline = false + +# JSON files +[*.json] +indent_size = 2 + +# Configuration files +[*.config] +indent_size = 2 + +# Dotnet code style settings +[*.{cs,vb}] + +# Sort using and Import directives with System.* appearing first +dotnet_sort_system_directives_first = true + +# Avoid "this." and "Me." if not necessary +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_event = false:suggestion + +# Use language keywords instead of framework type names for type references +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion + +# Use explicit accessibility modifiers +dotnet_style_require_accessibility_modifiers = true:suggestion + +# Suggest more modern language features when available +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_prefer_inferred_tuple_names = true:suggestion +dotnet_prefer_inferred_anonymous_type_member_names = true:suggestion + +# CSharp code style settings +[*.cs] + +# Prefer curly braces even for one line of code +csharp_prefer_braces = true:suggestion + +# Prefer "var" everywhere +csharp_style_var_for_built_in_types = true:suggestion +csharp_style_var_when_type_is_apparent = true:suggestion +csharp_style_var_elsewhere = true:suggestion + +# Prefer method-like constructs to have a block body +csharp_style_expression_bodied_methods = false:none +csharp_style_expression_bodied_constructors = false:none +csharp_style_expression_bodied_operators = false:none + +# Prefer property-like constructs to have an expression-body +csharp_style_expression_bodied_properties = true:none +csharp_style_expression_bodied_indexers = true:none +csharp_style_expression_bodied_accessors = true:none + +# Suggest more modern language features when available +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion +csharp_style_throw_expression = true:suggestion +csharp_style_conditional_delegate_call = true:suggestion +csharp_prefer_simple_default_expression = true:suggestion +csharp_style_deconstructed_variable_declaration = true:suggestion +csharp_style_pattern_local_over_anonymous_function = true:suggestion + +# Newline settings +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_between_query_expression_clauses = true + +csharp_indent_case_contents = true +csharp_indent_switch_labels = true +csharp_indent_labels = flush_left + +csharp_space_after_cast = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_parentheses = false + +csharp_preserve_single_line_statements = false +csharp_preserve_single_line_blocks = true diff --git a/.nuke b/.nuke new file mode 100644 index 0000000..5da4b47 --- /dev/null +++ b/.nuke @@ -0,0 +1 @@ +VirtoCommerce.GDPR.sln \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..3caa727 --- /dev/null +++ b/LICENSE @@ -0,0 +1,12 @@ +Copyright (c) Virto Solutions LTD.  All rights reserved. + +Licensed under the Virto Commerce Open Software License (the "License"); you +may not use this file except in compliance with the License. You may +obtain a copy of the License at + +https://virtocommerce.com/open-source-license + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied. diff --git a/VirtoCommerce.GDPR.sln b/VirtoCommerce.GDPR.sln new file mode 100644 index 0000000..cc3bedc --- /dev/null +++ b/VirtoCommerce.GDPR.sln @@ -0,0 +1,52 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 16 +VisualStudioVersion = 16.0.29920.165 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{CFC1B42A-2604-4030-BD28-7706B47C6365}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{60C5F34E-58CA-43A7-AFAF-57F20755E996}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VirtoCommerce.GDPR.Web", "src\VirtoCommerce.GDPR.Web\VirtoCommerce.GDPR.Web.csproj", "{E98EC09F-67E7-4C4C-90A0-AADF1DFBAFF9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VirtoCommerce.GDPR.Data", "src\VirtoCommerce.GDPR.Data\VirtoCommerce.GDPR.Data.csproj", "{24341E09-0617-4CBE-8E05-03DE87DA35B7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VirtoCommerce.GDPR.Tests", "tests\VirtoCommerce.GDPR.Tests\VirtoCommerce.GDPR.Tests.csproj", "{62A3D01E-8B7C-4ED9-BD39-B693C1FD8A73}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VirtoCommerce.GDPR.Core", "src\VirtoCommerce.GDPR.Core\VirtoCommerce.GDPR.Core.csproj", "{5EA581DB-C235-47CC-9DCB-EBD556B56CD9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E98EC09F-67E7-4C4C-90A0-AADF1DFBAFF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E98EC09F-67E7-4C4C-90A0-AADF1DFBAFF9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E98EC09F-67E7-4C4C-90A0-AADF1DFBAFF9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E98EC09F-67E7-4C4C-90A0-AADF1DFBAFF9}.Release|Any CPU.Build.0 = Release|Any CPU + {24341E09-0617-4CBE-8E05-03DE87DA35B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {24341E09-0617-4CBE-8E05-03DE87DA35B7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {24341E09-0617-4CBE-8E05-03DE87DA35B7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {24341E09-0617-4CBE-8E05-03DE87DA35B7}.Release|Any CPU.Build.0 = Release|Any CPU + {62A3D01E-8B7C-4ED9-BD39-B693C1FD8A73}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {62A3D01E-8B7C-4ED9-BD39-B693C1FD8A73}.Debug|Any CPU.Build.0 = Debug|Any CPU + {62A3D01E-8B7C-4ED9-BD39-B693C1FD8A73}.Release|Any CPU.ActiveCfg = Release|Any CPU + {62A3D01E-8B7C-4ED9-BD39-B693C1FD8A73}.Release|Any CPU.Build.0 = Release|Any CPU + {5EA581DB-C235-47CC-9DCB-EBD556B56CD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5EA581DB-C235-47CC-9DCB-EBD556B56CD9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5EA581DB-C235-47CC-9DCB-EBD556B56CD9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5EA581DB-C235-47CC-9DCB-EBD556B56CD9}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {E98EC09F-67E7-4C4C-90A0-AADF1DFBAFF9} = {CFC1B42A-2604-4030-BD28-7706B47C6365} + {24341E09-0617-4CBE-8E05-03DE87DA35B7} = {CFC1B42A-2604-4030-BD28-7706B47C6365} + {5EA581DB-C235-47CC-9DCB-EBD556B56CD9} = {CFC1B42A-2604-4030-BD28-7706B47C6365} + {62A3D01E-8B7C-4ED9-BD39-B693C1FD8A73} = {60C5F34E-58CA-43A7-AFAF-57F20755E996} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + 57819CCE-6A3D-4BFF-9701-60E3646AB795 = {57819CCE-6A3D-4BFF-9701-60E3646AB795} + EndGlobalSection +EndGlobal diff --git a/docs/media/diagram-db-model.drawio b/docs/media/diagram-db-model.drawio new file mode 100644 index 0000000..7d64fff --- /dev/null +++ b/docs/media/diagram-db-model.drawio @@ -0,0 +1 @@ +7Vtdc5s4FP01zOw+NMOHsZ3HmNrtTO1tJkl3H3cUkEFTjBghf/XXr4QkMJadQLeO1dgzngQuF4HuOTqSThzLCxabTwTkyQxHMLVcO9pY3kfLdR3bG7JfPLIVkb49EIGYoEgm1YFH9AOqO2V0iSJYNBIpxilFeTMY4iyDIW3EACF43Uyb47T51BzEUAs8hiDVo/+giCYiOvTtOv4ZojhRT3ZseWUBVLIMFAmI8LoRghs6wRmVr3gPyQJkMKPsygyQ75BY/jihlPf0znIn7DPn2TcxxnEKQY6KmxAvWDgsWMpkDhYo5WXeaWgkG2KP88aWFxCMqThabAKYcqwUDOKdJkeuVnUgvN0WNwQfVtvpd5tmn9fe33Q2i+8Hzx9kKyuQLmV9ZW3oVhUcRqz+8pQ9CtHtA0wBRTgb11dGMIvuOLosafzwAxL8hGcgY50fFRQQWl/DmUyfIPZ63kdHpchzm53rXZPvWeAlCeEL/XF7kpKAxJC+kNiXgEcNtsnKfYJ4ASnZsoR1zbGKSckuv1SQlEVZNVkKJJPiqsHqGfcYlcSSA9PryXbksBwoSqomRNflXbsw7zXU22uov9+QKI3WEDvY6XgdKlnUhVHuO6OU15JRzsAwSvXsJhOc4c9Sqt9syLX9N6WUzqivJIKk0HjFFD3nhxQ8lwwqSSCnMI+zgE1KFKCM6a9gSYjTFOQFKtNFJEFpNAVbvKSqIXU2mqMNjB7EDMZzGf+mrLFCUozPBYrV/DJIUZyx45BRjj9xRGDB3mUKCiozjpJyBQmFmxdZpLDx90BWw32HZa5/iGWefZxQDQS7wuW9LgAKKNZ1ikD6wBYKIItLzJqQ8LpGBOdPavTxQM6JBsl4BcVUXRafDfUAp5gjmwlBKNPKzvkj9mHdDewb3/LZCwTs3KnP2YenExrgrKAEoBIOyIBaQw7WiOJcPieFc/UaRBaTHz9jStnMfwzWF2n9OtYSW68ltCdDtqche/+lC7aY9XWelqqdoCiCmRiSfJ0IarwPQHmw/lXN98HYH4gt8fBa47EDgPeW9fe1+mMuhP+ymwLXurOFav/19Yn//DadWtVS1yR4lC6K3FGRgxBl8VTc2d/Dzz8Ffhvr6Hhy3xLP/iUr5eFV2a9Ryv65lXKgITv54nQB943GYksA+q0BOJc0DrWCh8uC9Vmoo3tAGo3D4lVd/OVgmaKDt1cdPI0O3p5bB5Vr+JPQmqWCt63Lfy4VdHQ/T6wQI0Ahi8tfFyGD7dEyRQYdfef8mKB8UYrW1evQvA532FLeTud1OPqW+IKmrg6ba6f97swUt8PRt9vvye6oqGvwdKZvkAspiFfPoyuIxsxy+t74giSzw3Kzu2Se3fZw9G34b+17VFw1WCP1zXNlCl+U7dEBK1Ok0P1/u+OrFBrsfLj6VtzAwdey/hVRzdVBVd5Da8ULdD86IGaMGur2RyA9/Kv9Ye18taPzVz3sk0F2tT9aDsffz/5w37f94Zpvf7i6/fHaHzUvyfvogKAxU9zV+ziVXp7d+3B178PAwdi2/uYbH65ufFTqmIEFX+mHCSB/+PafF7PoN8kCYaf1P7eIr4LX/5Hkjf8D \ No newline at end of file diff --git a/docs/media/diagram-db-model.png b/docs/media/diagram-db-model.png new file mode 100644 index 0000000000000000000000000000000000000000..834662991266273e35cd3e6dbd66f480d99c60f6 GIT binary patch literal 19704 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 P(ToA1YoY@#pTzxN!UK=I literal 0 HcmV?d00001 diff --git a/src/VirtoCommerce.GDPR.Core/Events/.keep b/src/VirtoCommerce.GDPR.Core/Events/.keep new file mode 100644 index 0000000..e69de29 diff --git a/src/VirtoCommerce.GDPR.Core/Models/.keep b/src/VirtoCommerce.GDPR.Core/Models/.keep new file mode 100644 index 0000000..e69de29 diff --git a/src/VirtoCommerce.GDPR.Core/ModuleConstants.cs b/src/VirtoCommerce.GDPR.Core/ModuleConstants.cs new file mode 100644 index 0000000..dc9559d --- /dev/null +++ b/src/VirtoCommerce.GDPR.Core/ModuleConstants.cs @@ -0,0 +1,61 @@ +using System.Collections.Generic; +using VirtoCommerce.Platform.Core.Settings; + +namespace VirtoCommerce.GDPR.Core +{ + public static class ModuleConstants + { + public static class Security + { + public static class Permissions + { + public const string Access = "GDPRModule:access"; + public const string Create = "GDPRModule:create"; + public const string Read = "GDPRModule:read"; + public const string Update = "GDPRModule:update"; + public const string Delete = "GDPRModule:delete"; + + public static string[] AllPermissions { get; } = { Read, Create, Access, Update, Delete }; + } + } + + public static class Settings + { + public static class General + { + public static SettingDescriptor GDPRModuleEnabled { get; } = new SettingDescriptor + { + Name = "GDPRModule.GDPRModuleEnabled", + GroupName = "GDPRModule|General", + ValueType = SettingValueType.Boolean, + DefaultValue = false + }; + + public static SettingDescriptor GDPRModulePassword { get; } = new SettingDescriptor + { + Name = "GDPRModule.GDPRModulePassword", + GroupName = "GDPRModule|Advanced", + ValueType = SettingValueType.SecureString, + DefaultValue = "qwerty" + }; + + public static IEnumerable AllSettings + { + get + { + yield return GDPRModuleEnabled; + yield return GDPRModulePassword; + } + } + } + + public static IEnumerable AllSettings + { + get + { + return General.AllSettings; + } + } + } + } +} diff --git a/src/VirtoCommerce.GDPR.Core/Notifications/.keep b/src/VirtoCommerce.GDPR.Core/Notifications/.keep new file mode 100644 index 0000000..e69de29 diff --git a/src/VirtoCommerce.GDPR.Core/Services/.keep b/src/VirtoCommerce.GDPR.Core/Services/.keep new file mode 100644 index 0000000..e69de29 diff --git a/src/VirtoCommerce.GDPR.Core/VirtoCommerce.GDPR.Core.csproj b/src/VirtoCommerce.GDPR.Core/VirtoCommerce.GDPR.Core.csproj new file mode 100644 index 0000000..c71b5f6 --- /dev/null +++ b/src/VirtoCommerce.GDPR.Core/VirtoCommerce.GDPR.Core.csproj @@ -0,0 +1,24 @@ + + + + netcoreapp3.1 + + + + + false + + + + + + + + + + + + + + + diff --git a/src/VirtoCommerce.GDPR.Data/Caching/.keep b/src/VirtoCommerce.GDPR.Data/Caching/.keep new file mode 100644 index 0000000..e69de29 diff --git a/src/VirtoCommerce.GDPR.Data/ExportImport/.keep b/src/VirtoCommerce.GDPR.Data/ExportImport/.keep new file mode 100644 index 0000000..e69de29 diff --git a/src/VirtoCommerce.GDPR.Data/Handlers/.keep b/src/VirtoCommerce.GDPR.Data/Handlers/.keep new file mode 100644 index 0000000..e69de29 diff --git a/src/VirtoCommerce.GDPR.Data/Models/.keep b/src/VirtoCommerce.GDPR.Data/Models/.keep new file mode 100644 index 0000000..e69de29 diff --git a/src/VirtoCommerce.GDPR.Data/Repositories/DesignTimeDbContextFactory.cs b/src/VirtoCommerce.GDPR.Data/Repositories/DesignTimeDbContextFactory.cs new file mode 100644 index 0000000..9c2c985 --- /dev/null +++ b/src/VirtoCommerce.GDPR.Data/Repositories/DesignTimeDbContextFactory.cs @@ -0,0 +1,17 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; + +namespace VirtoCommerce.GDPR.Data.Repositories +{ + public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory + { + public GDPRModuleDbContext CreateDbContext(string[] args) + { + var builder = new DbContextOptionsBuilder(); + + builder.UseSqlServer("Data Source=(local);Initial Catalog=VirtoCommerce3;Persist Security Info=True;User ID=virto;Password=virto;MultipleActiveResultSets=True;Connect Timeout=30"); + + return new GDPRModuleDbContext(builder.Options); + } + } +} diff --git a/src/VirtoCommerce.GDPR.Data/Repositories/GDPRModuleDbContext.cs b/src/VirtoCommerce.GDPR.Data/Repositories/GDPRModuleDbContext.cs new file mode 100644 index 0000000..a43970a --- /dev/null +++ b/src/VirtoCommerce.GDPR.Data/Repositories/GDPRModuleDbContext.cs @@ -0,0 +1,25 @@ +using EntityFrameworkCore.Triggers; +using Microsoft.EntityFrameworkCore; + +namespace VirtoCommerce.GDPR.Data.Repositories +{ + public class GDPRModuleDbContext : DbContextWithTriggers + { + public GDPRModuleDbContext(DbContextOptions options) + : base(options) + { + } + + protected GDPRModuleDbContext(DbContextOptions options) + : base(options) + { + } + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + // modelBuilder.Entity().ToTable("MyModule").HasKey(x => x.Id); + // modelBuilder.Entity().Property(x => x.Id).HasMaxLength(128); + // base.OnModelCreating(modelBuilder); + } + } +} + diff --git a/src/VirtoCommerce.GDPR.Data/Services/.keep b/src/VirtoCommerce.GDPR.Data/Services/.keep new file mode 100644 index 0000000..e69de29 diff --git a/src/VirtoCommerce.GDPR.Data/VirtoCommerce.GDPR.Data.csproj b/src/VirtoCommerce.GDPR.Data/VirtoCommerce.GDPR.Data.csproj new file mode 100644 index 0000000..3cff0fc --- /dev/null +++ b/src/VirtoCommerce.GDPR.Data/VirtoCommerce.GDPR.Data.csproj @@ -0,0 +1,33 @@ + + + + netcoreapp3.1 + + + + + false + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + diff --git a/src/VirtoCommerce.GDPR.Web/Content/logo.png b/src/VirtoCommerce.GDPR.Web/Content/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ca22993d6af972f18e48f7c2996f620c8cffb9f9 GIT binary patch literal 14153 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 tq2-Jl0F_DpXpfcf4V16`w{m4>!s#;{0VsuiVI! + /// Get message + /// + /// Return "Hello world!" message + [HttpGet] + [Route("")] + [Authorize(ModuleConstants.Security.Permissions.Read)] + public ActionResult Get() + { + return Ok(new { result = "Hello world!" }); + } + } +} diff --git a/src/VirtoCommerce.GDPR.Web/Localizations/en.GDPR.json b/src/VirtoCommerce.GDPR.Web/Localizations/en.GDPR.json new file mode 100644 index 0000000..94a2fc4 --- /dev/null +++ b/src/VirtoCommerce.GDPR.Web/Localizations/en.GDPR.json @@ -0,0 +1,28 @@ +{ + "GDPRModule": { + "blades": { + "hello-world": { + "title": "Hello world blade" + } + } + }, + "permissions": { + "GDPRModule:access": "Open GDPRModule menu", + "GDPRModule:create": "Create GDPRModule related data", + "GDPRModule:read": "View GDPRModule related data", + "GDPRModule:update": "Update GDPRModule related data", + "GDPRModule:delete": "Delete GDPRModule related data" + }, + "settings": { + "GDPRModule": { + "GDPRModulePassword": { + "title": "GDPRModule Password", + "description": "GDPRModule Password setting" + }, + "GDPRModuleEnabled": { + "title": "GDPRModule Enabled", + "description": "GDPRModule Enabled setting" + } + } + } +} \ No newline at end of file diff --git a/src/VirtoCommerce.GDPR.Web/Module.cs b/src/VirtoCommerce.GDPR.Web/Module.cs new file mode 100644 index 0000000..3ecadeb --- /dev/null +++ b/src/VirtoCommerce.GDPR.Web/Module.cs @@ -0,0 +1,58 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using System.Linq; +using VirtoCommerce.GDPR.Core; +using VirtoCommerce.GDPR.Data.Repositories; +using VirtoCommerce.Platform.Core.Modularity; +using VirtoCommerce.Platform.Core.Security; +using VirtoCommerce.Platform.Core.Settings; + +namespace VirtoCommerce.GDPR.Web +{ + public class Module : IModule + { + public ManifestModuleInfo ModuleInfo { get; set; } + + public void Initialize(IServiceCollection serviceCollection) + { + // database initialization + var configuration = serviceCollection.BuildServiceProvider().GetRequiredService(); + var connectionString = configuration.GetConnectionString("VirtoCommerce.GDPRModule") ?? configuration.GetConnectionString("VirtoCommerce"); + serviceCollection.AddDbContext(options => options.UseSqlServer(connectionString)); + } + + public void PostInitialize(IApplicationBuilder appBuilder) + { + // register settings + var settingsRegistrar = appBuilder.ApplicationServices.GetRequiredService(); + settingsRegistrar.RegisterSettings(ModuleConstants.Settings.AllSettings, ModuleInfo.Id); + + // register permissions + var permissionsProvider = appBuilder.ApplicationServices.GetRequiredService(); + permissionsProvider.RegisterPermissions(ModuleConstants.Security.Permissions.AllPermissions.Select(x => + new Permission() + { + GroupName = "GDPRModule", + ModuleId = ModuleInfo.Id, + Name = x + }).ToArray()); + + // Ensure that any pending migrations are applied + using (var serviceScope = appBuilder.ApplicationServices.CreateScope()) + { + using (var dbContext = serviceScope.ServiceProvider.GetRequiredService()) + { + dbContext.Database.EnsureCreated(); + dbContext.Database.Migrate(); + } + } + } + + public void Uninstall() + { + // do nothing in here + } + } +} diff --git a/src/VirtoCommerce.GDPR.Web/Scripts/blades/hello-world.html b/src/VirtoCommerce.GDPR.Web/Scripts/blades/hello-world.html new file mode 100644 index 0000000..e8a8175 --- /dev/null +++ b/src/VirtoCommerce.GDPR.Web/Scripts/blades/hello-world.html @@ -0,0 +1,7 @@ +
+
+
+
{{blade.data}}
+
+
+
\ No newline at end of file diff --git a/src/VirtoCommerce.GDPR.Web/Scripts/blades/hello-world.js b/src/VirtoCommerce.GDPR.Web/Scripts/blades/hello-world.js new file mode 100644 index 0000000..f8adbb5 --- /dev/null +++ b/src/VirtoCommerce.GDPR.Web/Scripts/blades/hello-world.js @@ -0,0 +1,15 @@ +angular.module('GDPRModule') + .controller('GDPRModule.helloWorldController', ['$scope', 'GDPRModule.webApi', function ($scope, api) { + var blade = $scope.blade; + blade.title = 'GDPRModule'; + + blade.refresh = function () { + api.get(function (data) { + blade.title = 'GDPRModule.blades.hello-world.title'; + blade.data = data.result; + blade.isLoading = false; + }); + }; + + blade.refresh(); + }]); diff --git a/src/VirtoCommerce.GDPR.Web/Scripts/module.js b/src/VirtoCommerce.GDPR.Web/Scripts/module.js new file mode 100644 index 0000000..f343ed3 --- /dev/null +++ b/src/VirtoCommerce.GDPR.Web/Scripts/module.js @@ -0,0 +1,42 @@ +// Call this to register your module to main application +var moduleName = 'GDPRModule'; + +if (AppDependencies !== undefined) { + AppDependencies.push(moduleName); +} + +angular.module(moduleName, []) + .config(['$stateProvider', '$urlRouterProvider', + function ($stateProvider, $urlRouterProvider) { + $stateProvider + .state('workspace.GDPRModuleState', { + url: '/GDPRModule', + templateUrl: '$(Platform)/Scripts/common/templates/home.tpl.html', + controller: [ + '$scope', 'platformWebApp.bladeNavigationService', function ($scope, bladeNavigationService) { + var newBlade = { + id: 'blade1', + controller: 'GDPRModule.helloWorldController', + template: 'Modules/$(VirtoCommerce.GDPR)/Scripts/blades/hello-world.html', + isClosingDisabled: true + }; + bladeNavigationService.showBlade(newBlade); + } + ] + }); + } + ]) + .run(['platformWebApp.mainMenuService', 'platformWebApp.widgetService', '$state', + function (mainMenuService, widgetService, $state) { + //Register module in main menu + var menuItem = { + path: 'browse/GDPRModule', + icon: 'fa fa-cube', + title: 'GDPRModule', + priority: 100, + action: function () { $state.go('workspace.GDPRModuleState'); }, + permission: 'GDPRModule:access' + }; + mainMenuService.addMenuItem(menuItem); + } + ]); diff --git a/src/VirtoCommerce.GDPR.Web/Scripts/resources/gdpr-api.js b/src/VirtoCommerce.GDPR.Web/Scripts/resources/gdpr-api.js new file mode 100644 index 0000000..f6c8602 --- /dev/null +++ b/src/VirtoCommerce.GDPR.Web/Scripts/resources/gdpr-api.js @@ -0,0 +1,4 @@ +angular.module('GDPRModule') + .factory('GDPRModule.webApi', ['$resource', function ($resource) { + return $resource('api/GDPRModule'); +}]); diff --git a/src/VirtoCommerce.GDPR.Web/VirtoCommerce.GDPR.Web.csproj b/src/VirtoCommerce.GDPR.Web/VirtoCommerce.GDPR.Web.csproj new file mode 100644 index 0000000..40d918f --- /dev/null +++ b/src/VirtoCommerce.GDPR.Web/VirtoCommerce.GDPR.Web.csproj @@ -0,0 +1,23 @@ + + + + netcoreapp3.1 + Library + + + + + false + + + + + + + + + Always + + + + diff --git a/src/VirtoCommerce.GDPR.Web/module.manifest b/src/VirtoCommerce.GDPR.Web/module.manifest new file mode 100644 index 0000000..ffe0f38 --- /dev/null +++ b/src/VirtoCommerce.GDPR.Web/module.manifest @@ -0,0 +1,30 @@ + + + VirtoCommerce.GDPR + 1.0.0 + + 3.84.0 + + + + + VirtoCommerce GDPR extension module + VirtoCommerce GDPR extension module + + + Leysan Nigmatullina + + + VirtoCommerce + + + VirtoCommerce.GDPR.Web.dll + VirtoCommerce.GDPR.Web.Module, VirtoCommerce.GDPR.Web + + First version. + Copyright © 2021 VirtoCommerce. All rights reserved + extension module + + + + diff --git a/src/VirtoCommerce.GDPR.Web/package-lock.json b/src/VirtoCommerce.GDPR.Web/package-lock.json new file mode 100644 index 0000000..cc6f82f --- /dev/null +++ b/src/VirtoCommerce.GDPR.Web/package-lock.json @@ -0,0 +1,1549 @@ +{ + "name": "asp.net", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@discoveryjs/json-ext": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz", + "integrity": "sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA==", + "dev": true + }, + "@types/eslint": { + "version": "7.28.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.1.tgz", + "integrity": "sha512-XhZKznR3i/W5dXqUhgU9fFdJekufbeBd5DALmkuXoeFcjbQcPk+2cL+WLHf6Q81HWAnM2vrslIHpGVyCAviRwg==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@types/node": { + "version": "16.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.5.tgz", + "integrity": "sha512-9iI3OOlkyOjLQQ9s+itIJNMRepDhB/96jW3fqduJ2FTPQj1dJjw6Q3QCImF9FE1wmdBs5QSun4FjDSFS8d8JLw==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.0.tgz", + "integrity": "sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==", + "dev": true + }, + "@webpack-cli/info": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.0.tgz", + "integrity": "sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.0.tgz", + "integrity": "sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA==", + "dev": true + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "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 + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browserslist": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.3.tgz", + "integrity": "sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001264", + "electron-to-chromium": "^1.3.857", + "escalade": "^3.1.1", + "node-releases": "^1.1.77", + "picocolors": "^0.2.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001265", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz", + "integrity": "sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "clean-webpack-plugin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-1.0.1.tgz", + "integrity": "sha512-gvwfMsqu3HBgTVvaBa1H3AZKO03CHpr5uP92SPIktP3827EovAitwW+1xoqXyTxCuXnLYpMHG5ytS4AoukHDWA==", + "dev": true, + "requires": { + "rimraf": "^2.6.1" + } + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css-loader": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", + "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash": "^4.17.11", + "postcss": "^6.0.23", + "postcss-modules-extract-imports": "^1.2.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" + } + }, + "css-selector-tokenizer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", + "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", + "dev": true, + "requires": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + } + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.867", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.867.tgz", + "integrity": "sha512-WbTXOv7hsLhjJyl7jBfDkioaY++iVVZomZ4dU6TMe/SzucV6mUAs2VZn/AehBwuZMiNEQDaPuTGn22YK5o+aDw==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "enhanced-resolve": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", + "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true + }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "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" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, + "icss-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "dev": true, + "requires": { + "postcss": "^6.0.1" + } + }, + "import-local": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz", + "integrity": "sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true + }, + "is-core-module": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.7.0.tgz", + "integrity": "sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jest-worker": { + "version": "27.2.5", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.5.tgz", + "integrity": "sha512-HTjEPZtcNKZ4LnhSp02NEH4vE+5OpJ0EsOWYvGQpHgUMLngydESAAMH5Wd/asPf29+XUDQZszxpLg1BkIIA2aw==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "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", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "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": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "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" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "mime-db": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", + "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==", + "dev": true + }, + "mime-types": { + "version": "2.1.33", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", + "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", + "dev": true, + "requires": { + "mime-db": "1.50.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.5.tgz", + "integrity": "sha512-dqBanNfktnp2hwL2YguV9Jh91PFX7gu7nRLs4TGsbAfAG6WOtlynFRYzwDwmmeSb5uIwHo9nx1ta0f7vAZVp2w==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.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 + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node-releases": { + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.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==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + }, + "dependencies": { + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + } + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "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 + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", + "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", + "dev": true, + "requires": { + "postcss": "^6.0.1" + } + }, + "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", + "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + } + }, + "postcss-modules-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + } + }, + "postcss-modules-values": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "dev": true, + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", + "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", + "dev": true + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "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 + }, + "source-map-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "terser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz", + "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==", + "dev": true, + "requires": { + "jest-worker": "^27.0.6", + "p-limit": "^3.1.0", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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 + }, + "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 + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "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==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "watchpack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", + "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webpack": { + "version": "5.58.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.58.2.tgz", + "integrity": "sha512-3S6e9Vo1W2ijk4F4PPWRIu6D/uGgqaPmqw+av3W3jLDujuNkdxX5h5c+RQ6GkjVR+WwIPOfgY8av+j5j4tMqJw==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.8.3", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.2.0", + "webpack-sources": "^3.2.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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 + }, + "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 + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "webpack-sources": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.1.tgz", + "integrity": "sha512-t6BMVLQ0AkjBOoRTZgqrWm7xbXMBzD+XDq2EZ96+vMfn3qKgsvdXZhbPZ4ElUOpdv4u+iiGe+w3+J75iy/bYGA==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.0.tgz", + "integrity": "sha512-n/jZZBMzVEl4PYIBs+auy2WI0WTQ74EnJDiyD98O2JZY6IVIHJNitkYp/uTXOviIOMfgzrNvC9foKv/8o8KSZw==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.1.0", + "@webpack-cli/info": "^1.4.0", + "@webpack-cli/serve": "^1.6.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "v8-compile-cache": "^2.2.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + } + } + }, + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.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" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/src/VirtoCommerce.GDPR.Web/package.json b/src/VirtoCommerce.GDPR.Web/package.json new file mode 100644 index 0000000..92a6c13 --- /dev/null +++ b/src/VirtoCommerce.GDPR.Web/package.json @@ -0,0 +1,18 @@ +{ + "version": "1.0.0", + "name": "asp.net", + "private": true, + "scripts": { + "webpack:dev": "webpack --mode=development", + "webpack:watch": "webpack --watch --mode=development", + "webpack:build": "webpack --mode=production" + }, + "devDependencies": { + "clean-webpack-plugin": "^1.0.0", + "css-loader": "^1.0.1", + "mini-css-extract-plugin": "^0.4.5", + "webpack": "^5.58.1", + "webpack-cli": "^4.9.0" + }, + "dependencies": {} +} diff --git a/src/VirtoCommerce.GDPR.Web/webpack.config.js b/src/VirtoCommerce.GDPR.Web/webpack.config.js new file mode 100644 index 0000000..25fbfc1 --- /dev/null +++ b/src/VirtoCommerce.GDPR.Web/webpack.config.js @@ -0,0 +1,44 @@ +const glob = require('glob'); +const path = require('path'); +const webpack = require('webpack'); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +const CleanWebpackPlugin = require('clean-webpack-plugin'); + +const rootPath = path.resolve(__dirname, 'dist'); + +function getEntrypoints() { + const result = [ + ...glob.sync('./Scripts/**/*.js', { nosort: true }), + ...glob.sync('./Content/**/*.css', { nosort: true }) + ]; + + return result; +} + +module.exports = [ + { + entry: getEntrypoints(), + output: { + path: rootPath, + filename: 'app.js' + }, + module: { + rules: [ + { + test: /\.css$/, + use: [MiniCssExtractPlugin.loader, 'css-loader'], + } + ] + }, + devtool: false, + plugins: [ + new webpack.SourceMapDevToolPlugin({ + namespace: 'VirtoCommerce.GDPR' + }), + new CleanWebpackPlugin(rootPath, { verbose: true }), + new MiniCssExtractPlugin({ + filename: 'style.css' + }) + ] + } +]; diff --git a/tests/VirtoCommerce.GDPR.Tests/Test.cs b/tests/VirtoCommerce.GDPR.Tests/Test.cs new file mode 100644 index 0000000..304245c --- /dev/null +++ b/tests/VirtoCommerce.GDPR.Tests/Test.cs @@ -0,0 +1,17 @@ +using Xunit; + +namespace VirtoCommerce.GDPR.Tests +{ + public class Test + { + public Test() + { + } + + [Fact] + public void Run_Test() + { + Assert.Equal(0, 0); + } + } +} diff --git a/tests/VirtoCommerce.GDPR.Tests/VirtoCommerce.GDPR.Tests.csproj b/tests/VirtoCommerce.GDPR.Tests/VirtoCommerce.GDPR.Tests.csproj new file mode 100644 index 0000000..f840777 --- /dev/null +++ b/tests/VirtoCommerce.GDPR.Tests/VirtoCommerce.GDPR.Tests.csproj @@ -0,0 +1,27 @@ + + + + netcoreapp3.1 + + false + + + + + true + + + + + + + + + + + + + + + +